Data Management Report Transformative Change Assessment Corpus - SOD

Author
Affiliation

Rainer M. Krug

Published

May 3, 2024

Doi
Abstract

The literature search for the assessment corpus was conducted using search terms provided by the experts and refined in co-operation with the Knowldge and Data task force. The search was conducted using OpenAlex, scripted from R to use the API. Search terms for the following searches were defined: Transformative Change, Nature / Environment and additional search terms for individual chapters and sub-chapters To assess the quality of the corpus, sets of key-papers were selected by the experts to verify if these are in the corpus. These key-papers were selected per chapter / sub-chapter to ensure that the corpus is representative of each chapter.

Keywords

DMR, TCA, Assessment Corpus

DOI GitHub release GitHub commits since latest release License: CC BY 4.0

Working Title

IPBES_TCA_Corpus

Code repo

Github repository

Build No: 615

Introduction

The following terminology is used in this document:

  • Individual corpus: The corpus resulting from one search term, e.g. transformative or nature or ChX_Y
  • Assessment Corpus: The corpus resulting from the search terms transformative AND nature
  • Chapter corpus: The corpus resulting from transformative AND Nature AND ChX_Y

The following searches are conducted on Title and Abstrat only as the availability of fulltext drops in 2020. OpenAlex did “inherit” fro Microsoft Academic their initial corpus in 2021 which contained a lot of fulltext for searches. After that time, other sources had to be used which did not include fulltext for searches. To eliminate this bias, we linit the search for terms in abstract and title only.

Schematic Overview

Show the code
#|

basename <- file.path("figures", "tca_corpus", "tca_corpus")

nf <- list.files(
    path = dirname(basename),
    pattern = basename(basename)
) |>
    length()

if (nf < 3) {
    puml <- readLines(file.path("input", "tca_corpus", "tca_corpus.plantuml")) |>
        paste(collapse = "\n") |>
        plantuml::plantuml()

    puml |>
        plantuml::get_graph(
            file = file.path("figures", "tca_corpus", "tca_corpus_overview.pdf")
        )

    puml |>
        plantuml::get_graph(
            file = file.path("figures", "tca_corpus", "tca_corpus_overview.svg")
        )

    puml |>
        plantuml::get_graph(
            file = file.path("figures", "tca_corpus", "tca_corpus_overview.png")
        )
}

Schematic overview of the TCA Corpus as well as othher corpora using the TCA Corpus

Search Terms

Here are the search terms used in this document. They were provided by the authors, and some adaptations were done by the tsu to adopt them for OpenAlex.

Transformative Change

Show the code
cat(params$s_1_transformative_change)
(
    (
        (
            transformation
            OR transition
            OR transformative
            OR "transformative change"
        )
        OR (
            (
                shift
                OR change
            )
            AND (
                fundamental
                OR deep
                OR radical
            )
        )
    )
    AND (
        socio
        OR social
        OR politics
        OR political
        OR governance
        OR economic
        OR cultural
        OR system
        OR technological
        OR inner
        OR personal
        OR financial
        OR business
    )
)
OR (
    (
        "transformative change"
        OR "deliberate transformation"
        OR "transformative turn"
        OR transition
        OR "social-ecological change"
        OR "deep change"
        OR "fundamental alteration"
        OR "profound change"
        OR "profound transformation"
        OR "radical transformation"
        OR "transformational change"
        OR "complete change"
        OR "complete transformation"
        OR "drastic change"
        OR "in-depth transformation"
        OR "progressive change"
        OR "radical alteration"
        OR "radical change"
        OR "revolutionary change"
        OR "significant modification"
        OR "total transformation"
        OR transition
        OR pathway
        OR power
        OR agency
        OR scale
        OR leverage
        OR context
        OR process
        OR regime
        OR shift
        OR views
        OR value
        OR structure
        OR institution
        OR deliberate
        OR structural
        OR fundamental
        OR system
        OR deep
        OR radical
        OR profound
        OR drastic
        OR widespread
        OR political
        OR economical
        OR structur
        OR complete
        OR progressive
        OR revolutionary
        OR substantial
        OR significant
    )
    AND (
        transformation
        OR alteration
        OR change
        OR turn
        OR action
        OR transition
        OR shift
    )
)

Nature

Show the code
#|

cat(params$s_1_nature_environment)
biodiversity
OR marine
OR terrestrial
OR forest
OR woodland
OR grassland
OR savanna
OR shrubland
OR peatland
OR ecosystem
OR lake
OR river
OR sea
OR ocean
OR meadow
OR heathland
OR mires
OR bog
OR tundra
OR biosphere
OR desert
OR mountain
OR "natural resource"
OR estuary
OR fjord
OR fauna
OR flora
OR soil
OR "coastal waters"
OR wetland
OR freshwater
OR marshland
OR marches
OR dryland
OR seascape
OR landscape
OR coast
OR "arable land"
OR "agricultural land"
OR "natural environment"
OR "environmental resource"
OR agroforest
OR "agro-forest"
OR plantation
OR "protected areas"
OR chaparral
OR sustainable
OR environment
OR conservation
OR ecosystem
OR nature
OR planet
OR Earth
OR biosphere
OR ecological
OR "socio-ecological"
OR restoration
OR wildlife
OR landscape
OR species
OR bioeconomy
OR "resource system"
OR "coupled system"
OR nature

Assessment Corpus

Show the code
#|

cat(params$s_1_tca_corpus)
( biodiversity
OR marine
OR terrestrial
OR forest
OR woodland
OR grassland
OR savanna
OR shrubland
OR peatland
OR ecosystem
OR lake
OR river
OR sea
OR ocean
OR meadow
OR heathland
OR mires
OR bog
OR tundra
OR biosphere
OR desert
OR mountain
OR "natural resource"
OR estuary
OR fjord
OR fauna
OR flora
OR soil
OR "coastal waters"
OR wetland
OR freshwater
OR marshland
OR marches
OR dryland
OR seascape
OR landscape
OR coast
OR "arable land"
OR "agricultural land"
OR "natural environment"
OR "environmental resource"
OR agroforest
OR "agro-forest"
OR plantation
OR "protected areas"
OR chaparral
OR sustainable
OR environment
OR conservation
OR ecosystem
OR nature
OR planet
OR Earth
OR biosphere
OR ecological
OR "socio-ecological"
OR restoration
OR wildlife
OR landscape
OR species
OR bioeconomy
OR "resource system"
OR "coupled system"
OR nature ) 
AND 
( (
    (
        (
            transformation
            OR transition
            OR transformative
            OR "transformative change"
        )
        OR (
            (
                shift
                OR change
            )
            AND (
                fundamental
                OR deep
                OR radical
            )
        )
    )
    AND (
        socio
        OR social
        OR politics
        OR political
        OR governance
        OR economic
        OR cultural
        OR system
        OR technological
        OR inner
        OR personal
        OR financial
        OR business
    )
)
OR (
    (
        "transformative change"
        OR "deliberate transformation"
        OR "transformative turn"
        OR transition
        OR "social-ecological change"
        OR "deep change"
        OR "fundamental alteration"
        OR "profound change"
        OR "profound transformation"
        OR "radical transformation"
        OR "transformational change"
        OR "complete change"
        OR "complete transformation"
        OR "drastic change"
        OR "in-depth transformation"
        OR "progressive change"
        OR "radical alteration"
        OR "radical change"
        OR "revolutionary change"
        OR "significant modification"
        OR "total transformation"
        OR transition
        OR pathway
        OR power
        OR agency
        OR scale
        OR leverage
        OR context
        OR process
        OR regime
        OR shift
        OR views
        OR value
        OR structure
        OR institution
        OR deliberate
        OR structural
        OR fundamental
        OR system
        OR deep
        OR radical
        OR profound
        OR drastic
        OR widespread
        OR political
        OR economical
        OR structur
        OR complete
        OR progressive
        OR revolutionary
        OR substantial
        OR significant
    )
    AND (
        transformation
        OR alteration
        OR change
        OR turn
        OR action
        OR transition
        OR shift
    )
) )

Chapter 1

01

Show the code
#|

cat(params$s_1_ch1_01)
(
    root
    OR underlying
    OR indirect
)
AND (
    driver
    OR cause
)

02

Show the code
#|

cat(params$s_1_ch1_02)
equity
OR inequity
OR just
OR unjust
OR inequality
OR equality
OR Fair
OR unfair

03

Show the code
#|

cat(params$s_1_ch1_03)
scale
OR impact
OR leapfrog
OR transfer

04

Show the code
#|

cat(params$s_1_ch1_04)
inclusive
OR participation
OR participatory
OR engagement
OR democratic
OR coproduct
OR transdisc
OR multiactor
OR "multi-actor"
OR integrat

05

Show the code
#|

cat(params$s_1_ch1_05)
evaluate
OR reflex
OR reflect
OR monitor
OR adapt
OR learn

06

Show the code
#|

cat(params$s_1_ch1_06)
responsib
OR accountable
OR rights
OR steward
OR reciprocity
OR interdependent
OR interdependency
OR (
    relation
    OR relational
    OR plural
    OR diverse
    OR "sustainability-aligned"
    OR (
        care
        AND (
            value
            OR ethic
        )
    )
)

Chapter 2

Show the code
#|

cat(params$s_1_ch2)
vision
OR future
OR visionary
OR scenarios
OR imagination
OR imagery
OR creativity
OR desire
OR wish
OR visioning
OR process
OR "participaory process"
OR "deliberate process"
OR polics
OR target
OR view
OR value
OR cosmovision
OR cosmocentric
OR dream
OR fiction
OR hope
OR mission
OR objective
OR story
OR worldview
OR aspiration
OR action
OR plan
OR strategy
OR intention
OR model
OR solution
OR innovation
OR perspective
OR platform
OR collective action
OR cooperation
OR consultation
OR coalition
OR response
OR movement
OR effort
OR initiative
OR activity
OR reaction
OR performance
OR operation
OR effect
OR task
OR project
OR influence
OR moment
OR discourse
OR motivation
OR iteration
OR roadmap
OR agenda
OR project
OR programm
OR government
OR technique
OR inspiration
OR culture
OR universe
OR reality
OR fantasy
OR perception
OR visualization
OR approach
OR image
OR arquetype
OR existence
OR cosmology
OR co - production
OR knowledge
OR dialogue
OR transmission
OR conceptual
OR ceremony
OR relationships
OR respect
OR reciprocity
OR responsibilities
OR solidarity
OR harmony
OR self - determination
OR community
OR spiritual
OR languague
OR territory
OR opportunity
OR sight
OR foresight
OR idea
OR appearance

Chapter 3

01

Show the code
#|

cat(params$s_1_ch3_01)
Technology
OR Science
OR "science-society"
OR "science-technology"
OR Solution

02

Show the code
#|

cat(params$s_1_ch3_02)
"co-create"
OR "co-creation"
OR solution
OR knowledge
OR system
OR "t-lab"
OR "technology laboratory"
OR education
OR "socio-technical"

03

Show the code
#|

cat(params$s_1_ch3_03)
System
OR pathways
OR connect
OR Agroecolog
OR Institutional
OR Institution
OR Government

04

Show the code
#|

cat(params$s_1_ch3_04)
inner
OR Personal
OR Religion
OR Love
OR Loving
OR Feelings
OR Stewardship
OR Care
OR Beliefs
OR Belief
OR believe
OR Awareness
OR "Self-Awareness"

05

Show the code
#|

cat(params$s_1_ch3_05)
Worldviews
OR Grassroot
OR "Community-based"
OR Indigenous
OR Leadership
OR "Critical Science"
OR Econfeminism
OR "Political Ecology"
OR Power
OR Agency
OR Environment

06

Show the code
#|

cat(params$s_1_ch3_06)
Economic
OR "Political Economy"
OR institution
OR govern
OR economy
OR governance
OR government
OR globalization
OR states
OR colonial
OR colonialiasism
OR labour
OR organization
OR organisation

Chapter 4

01

Show the code
#|

cat(params$s_1_ch4_01)
(
    challenge
    OR barrier
    OR obstacle
    OR hinder
    OR hindrance
    OR block
    OR prevent
    OR deter
    OR inertia
    OR "path dependence"
    OR "path dependency"
    OR stasis
    OR "lock-in"
    OR trap
    OR habits
    OR habitual
    OR "status quo"
    OR power
    OR "limiting factOR"
)
AND (
    economic inequality
    OR "Wealth concentration"
    OR "Socioeconomic inequality"
    OR financialization
    OR "uneven development"
    OR Financialization
    OR "Structural adjustment"
    OR "Sovereign Debt"
    OR inequality
    OR "Policy effectiveness"
)

02

Show the code
#|

cat(params$s_1_ch4_02)
(
    challenge
    OR barrier
    OR obstacle
    OR hinder
    OR hindrance
    OR block
    OR prevent
    OR deter
    OR inertia
    OR "path dependence"
    OR "path dependency"
    OR stasis
    OR "lock-in"
    OR trap
    OR habits
    OR habitual
    OR status quo
    OR power
    OR "limiting factor"
)
AND (
    "clean technology"
    OR "clean innovation*"
    OR "sustainable innovation"
    OR "sustainable technological innovation"
)
AND (
    "limited access"
    OR "limited availability"
    OR "lack of access"
    OR "unavailability"
)

Art

Show the code
#|

cat(params$st_art)
Painting OR
Sculpture OR
Photography OR
Drawing OR
Printmaking OR
Ceramics OR
Performance art OR
"Digital art" OR
Figurative OR
Contemporary OR
Gallery OR
Exhibition OR
"Art history" OR
"Fine arts" OR 
"Art critique" OR
Collage OR
"Street art" OR
Portraiture OR
Minimalism OR
Surrealism OR
Expressionism OR
"Art therapy" OR
"Art education" OR
"Public art" OR
"Art collecting" OR
"Art fairs" OR
"Modern art" OR
Renaissance
Baroque OR
Impressionism OR
Cubism OR
Realism OR
"Art movements" OR
"Conceptual art" OR
"Art funding" OR
"Art workshops" OR
"Art communities" OR
"Art criticism" OR
"Eco art" OR
"Folk art" OR
Muralism OR
"Art residence"

Media

Show the code
#|

cat(params$st_art)
Painting OR
Sculpture OR
Photography OR
Drawing OR
Printmaking OR
Ceramics OR
Performance art OR
"Digital art" OR
Figurative OR
Contemporary OR
Gallery OR
Exhibition OR
"Art history" OR
"Fine arts" OR 
"Art critique" OR
Collage OR
"Street art" OR
Portraiture OR
Minimalism OR
Surrealism OR
Expressionism OR
"Art therapy" OR
"Art education" OR
"Public art" OR
"Art collecting" OR
"Art fairs" OR
"Modern art" OR
Renaissance
Baroque OR
Impressionism OR
Cubism OR
Realism OR
"Art movements" OR
"Conceptual art" OR
"Art funding" OR
"Art workshops" OR
"Art communities" OR
"Art criticism" OR
"Eco art" OR
"Folk art" OR
Muralism OR
"Art residence"

Strategies and Options

In contrast to the other search term, this opne contains multiple sets of search terms

Show the code
#|

cat(params$sts_strategies_options)
# 1) Conserve and regenerate places of value to nature and people  ## Environmental conservation and protection  "Biosphere reserve" OR "Blue park" OR "Environmental impact assessment" OR "Forest conservation" OR "Forest Reserve" OR "Habitat Conservation Plan" OR "High sea conservation" OR "High seas conservation" OR "Invasive Species Regulation" OR "Marine managed area" OR "Marine park" OR "Marine protected area" OR "Marine reserve" OR "Marine resource areas" OR "National biodiversity strategy and action plan" OR "national park" OR "nature reserve" OR "Private reserve" OR "Protected area" OR "Remedial action" OR "Transboundary protected area" OR "Wild species protection" OR "Wildlife reserve"  ## Environmental management and monitoring  "Coastal governance" OR "Coastal management" OR "Coastal monitoring" OR "Environmental monitoring" OR "Environmental remote sensing" OR "Fish monitoring" OR "Forest monitoring" OR "Integrated coastal zone management" OR "Integrated landscape management" OR "Invasive alien species management" OR "Land monitoring" OR "Marine and coastal governance" OR "Marine governance" OR "Marine mammal monitoring" OR "Marine monitoring" OR "Ocean governance" OR "Ocean monitoring" OR "sustainable land management" OR "Sustainable wildlife management" OR "Species monitoring" OR "Transboundary water management" OR "Waste Management" OR "Watershed management"  ## Right-based approaches  "Access and benefit sharing" OR "Community rights" OR "Food sovereignty" OR "Free prior and informed consent" OR "Human rights" OR "Indigenous and local language" OR "Intellectual property right" OR "Civil and Political Rights" OR "Economic Social and Cultural Rights" OR "International Human Rights Treaty" OR "International Labour Organization Convention" OR "Land sovereignty" OR "Land tenure" OR "Legal empowerment" OR "Individual transferable rights" OR "Nature rights" OR "Rights of nature" OR "Right to water" OR "Tenure right" OR "Rights of Indigenous Peoples"  ## Conservation through multiple values of nature  "Biocultural conservation" OR "Bottom-up environmental initiative"  OR "Community-based management" OR "Community-led conservation" OR "Community-led conservation" OR "Community protocol" OR "Community quota" OR "Convivial conservation" OR "Comanagement" OR "Farmers Market" OR "Indigenous and Community Conserved Area" OR "Indigenous co-governance" OR "Indigenous-led conservation"  OR "Legal pluralism" OR "Multi-functional Landscape" OR "Other effective area-based Conservation Measure" OR "Recreation area" OR "Sacred grove" OR "Sacred site" OR "Stewardship" OR "Tribal park"  ## Spatial planning and land use management   "Buffer zone" OR "Coastal planning area" OR "Development Control Regulation" OR "Environmental Spatial Analysis" OR "Infrastructure Planning" OR "Land Law" OR "Land Use Permit" OR "Land Use Planning" OR "Marine Spatial Planning" OR "Master Plan"  OR "Ocean Planning" OR "Participatory Planning" OR "Spatial Planning" OR "Strategic Environmental Assessment"  ## Restoration and regeneration  "Biodiversity restoration" OR "Connectivity restoration" OR "Ecosystem restoration" OR "Ecological restoration" OR "Forest restoration" OR "Habitat restoration" OR "Species reintroduction" OR "Landscape restoration" OR "Regenerative agriculture" OR "Regenerative farming" OR "Rewilding" OR "soil restoration"  # 2) Drive systemic change in the sectors most responsible for natures decline  ## Regulation measures for resource management  "Cap resource consumption" OR "Consumption fee" OR "Consumption regulation" OR "Conversion off-budget subsidies" OR "Cross-compliance" OR "Emission caps" OR "habitat protection" OR "Land use regulation" OR "Land acquisition regulation" OR "Licensing and permitting"  OR "Logging regulation" OR "Pollution control" OR "Process regulation" OR "Regulation of resource extraction" OR "Regulatory measure" OR "Resource use restriction" OR "Sustainable public procurement" OR "Tax on consumption" OR "Territorial use-rights for fisheries" OR "Trade regulation" OR "Wildlife trade regulation" OR "Zoning regulation"  ## Market-Based innovative instruments for conservation  "Biodiversity compensation" OR "Biodiversity conservation banking" OR "Biodiversity offset" OR "Cap and Trade" OR "Cap and share" OR "Carbon credit" OR "Commodity future" OR "Corporate Social Responsibility" OR "Derivative trading" OR "Ecological fiscal transfer" OR "environmental Mitigation" OR "Environmental Tax"  OR "Environmental impact bonds" OR "Green subsidy" OR "internalization of externalities" OR "Market-based financing mechanism" OR  "No net loss" OR "Payment for ecosystem services" OR "Reducing Emissions from Deforestation and Forest Degradation" OR "remediation" OR "Subsidy reform" OR "Tradable permit" OR "Trade ban" OR "True cost pricing" OR "Zero deforestation"  ## Standards, certification, and supply chain initiatives  "Certification" OR "Collaborative supply chain initiative" OR "Commodity chain regulation" OR "Consumer demand for transparency" OR "Corporate disclosure mandate" OR "Eco Labeling" OR "Fair Trade Certification" OR "Forest Stewardship Council Certification" OR "Global sustainable seafood initiative" OR "green branding" OR "Guideline" OR "ISO Standard" OR "Labeling" OR "LEED Certification" OR "Mandatory reporting requirement" OR "Marine Stewardship Council Certification" OR "Non-GMO Project Verification" OR "Organic Certification" OR "Participatory Guarantee System" OR "Production standards" OR "Standard" OR "Sustainable sourcing" OR "Third-party auditing" OR "Third-party verification" OR "seafood watch"  ## Sustainable consumption  "Collaborative Consumption" OR "Dietary transition" OR "Food Cooperative" OR "Food waste reduction" OR "frugal consumption" OR "green consumption" OR "Localized food system" OR "low-impact diet" OR "plant-based diet" OR "Reduce consumption" OR "Recycle" OR "Responsible consumption" OR "Reuse" OR "shared consumption" OR "shared ownership" OR "Sustainable consumption" OR "Sustainable use"  ## Sustainable production  "Agri-Environmental and Climate Measure" OR "Agroecology" OR "Agroforestry" OR "Biological agriculture" OR "Best practice in production" OR "Carbon farming" OR "Climate-smart agriculture" OR "Community-supported Agriculture" OR "Conservation tillage" OR "Crop diversification" OR "downscale production" OR "Holistic planned grazing" OR "Organic agriculture" OR "Reduced impact logging" OR "Responsible production" OR "Sustainable agricultural intensification" OR "sustainable aquaculture" OR "Sustainable design" OR "Sustainable fishing" OR "Sustainable production" OR "Sustainable Small-Scale Fisheries" OR "Swidden agriculture"  ## Nature finance  "Biodiversity finance" OR "Climate finance" OR "Conservation finance" OR "Conservation funding" OR "Conservation philanthropy" OR "Conservation trust fund" OR "Debt-for-nature swap" OR "Direct funding to community" OR "Ecological finance" OR "Environmental finance" OR "Environmental harmful subsidies" OR "Nature-dependent economic activities" OR "Nature finance" OR "Ocean finance" OR "Public funding for conservation" OR "Public-private partnership"  ## Community activism and environmental advocacy  "boycotts" OR "Citizen-led environmental initiative" OR "collective action networks" OR "Community Garden" OR "environmental action groups" OR "environmental defenders" OR "environmental lawsuits" OR "environmental mobilizations" OR "environmental social movements" OR "Formal petitions" OR "hunger strikes" OR "land occupation" OR "media-based activism" OR "name and shame" OR "Non-cooperation" OR "Non-violent protest" OR "objections to environmental impacts assessments" OR "persuasion" OR "public campaigns" OR "refusal of compensation payments" OR "road blockades" OR "Strikes" OR "street protests" OR "Transition Town Movement" OR "Urban gardening" OR "Zero Waste Community"  ## Green infrastructure  "Access to urban service" OR "Biofilter" OR "Bioswale" OR "Blue-green corridor" OR "Constructed wetland" OR "Energy efficient building" OR "Floodplain restoration" OR "Green architecture" OR "Green infrastructure" OR "green logistics" OR "Green roof" OR "Green street" OR "Green wall" OR "Living shoreline" OR "Multi-purpose structure" OR "nature-based solution" OR "Permeable pavement" OR "Public transport" OR "Rain garden" OR "Riparian buffer" OR "Sustainable drainage system" OR "Sustainable infrastructure" OR "Urban agriculture space" OR "Urban forest" OR "Urban park" OR "Vegetated swale" OR "Water infrastructure"    ## Green technology  "Biofuel" OR "Biomass energy production" OR "Biomimetic" OR "Climate-smart agriculture" OR "Coordinated transport" OR "Coordinated heating"  OR "energy sharing platform" OR "Fuel-efficient vehicle" OR "Geothermal energy" OR "Green building material" OR "green technology" OR "Hybrid vehicle" OR "Minigrid" OR "microgrid" OR "Replacement fertilizer" OR "Small renewable energy technology" OR "Smart meter" OR "Solar panel" OR "Solar photovoltaic system" OR "Wind turbine"  # 3) Transform economic systems to address power inequities and extractivist activities  ## Alternative measures of wellbeing  "Doughnut planning" OR "Ecological Footprint" OR "Genuine Progress Indicator" OR "Green GDP" OR "Gross National Happiness" OR "Happy Planet Index" OR "Human Development Index" OR "Inclusive Wealth Index" OR "Index of Sustainable Economic Welfare" OR "inequality index" OR "real wealth of nations" OR "Social Progress Index" OR "wellbeing budget"    ## Financial system reform  "Central bank reform" OR "debt relief" OR "Debt service suspension" OR "dismantle off-shore accounts" OR "International Monetary Fund reform" OR "financial reform" OR "progressive taxation on wealth"  OR "reduce tax havens" OR "regulate inequalities" OR "sustainable finance" OR "tobin tax" OR "wealth tax" OR "World Trade Organization reform"  ## Alternative economic models  "Alternative business" OR "Alternative economic" OR "B-Corp" OR "Bioeconomy" OR "Business for Nature" OR "Caring economy" OR "Circular economy" OR "circular bioeconomy" OR "Commoning" OR "Cradle-to-Cradle" OR "Degrowth" OR "Doughnut Economics" OR "Economic of Biodiversity" OR "ecological economics" OR "Ecosystem accounting" OR "Mainstreaming biodiversity" OR "nature positive economy" OR "Natural capital accounting" OR "Natural Social Contract" OR "nature-related financial disclosure" OR "not-for-profit economy" OR "regenerative business" OR "regenerative capitalism" OR "Sharing economy" OR "Steady state economy" OR "System of Environmental Economic Accounting" OR "Wellbeing Economics"  # 4) Transform governance systems to be inclusive, accountable, and adaptive  ## Integrated governance  "biodiversity advocacy" OR "cross-sectoral coordination" OR "Ecosystem-based management" OR "environmental advocacy" OR "Institutional arrangement" OR "Institutional entrepreneurship" OR "Institutional reform" OR "integrated assessment" OR "multilevel governance" OR "Policy coordination" OR "social capital" OR "strategic planning" OR "strategy visioning"  ## Inclusive governance  "Bottom-up governance" OR "Citizen assembly" OR "Citizen Science Initiative" OR "Community Meeting" OR "Community-Based Participatory Research" OR "Deliberative Democracy Process" OR "Environmental public interest litigation" OR "Environmental Law" OR "Gender inclusive governance" OR "Gender-responsive governance" OR "Global action network" OR "Indigenous and local community participation" OR "Multi-stakeholder platform" OR "Participatory evaluation and learning" OR "Participatory restoration" OR "Participatory decision-making" OR "Policy co-creation" OR "Policy co-design" OR "Public Consultation and Hearing" OR "Public participation" OR "Resource Management Law" OR "Stakeholder engagement"  ## Multilateral action   "Aichi Biodiversity Target" OR "Basel Convention" OR "Cartagena Protocol" OR "Convention on Biological Diversity" OR "Convention on International Trade in Endangered Species" OR "Convention on Migratory Species" OR "Convention to Combat Desertification" OR "EU Green Deal" OR "International Convention for the Prevention of Pollution from Ships" OR "International Treaty on Plant Genetic Resources for Food and Agriculture" OR "Kyoto Protocol" OR "Minamata Convention" OR "Montreal Protocol" OR "Multilateral environmental agreement" OR "Nagoya Protocol" OR "Paris Agreement" OR "Ramsar Convention" OR "Rio Declaration" OR "Rotterdam Convention" OR "Stockholm Convention" OR "Sustainable Development Goal"  ## Adaptive governance  "Accountability" OR "adaptive governance" OR "Adaptive management framework" OR "Advocacy network" OR "Conflict resolution mechanism" OR "Deliberative democracy mechanism" OR "Deep democracy" OR "flexible regulation" OR "Informed governance" OR "iterative decision making" OR "iterative planning" OR "Local governance structure" OR "Monitoring evaluation and learning" OR "Open government initiative" OR "Policy monitoring" OR "Planning monitoring evaluation and review" OR "Reflexive governance" OR "risk assessment" OR "Transparency and accountability"  ## Transparent governance  "Anti-corruption measures" OR "Anti-discrimination law" OR "Convention against Corruption" OR "conflict of interest regulation" OR "Corporate Sustainability Reporting Directive" OR "Decentralization law" OR "Equitable access to justice" OR "Freedom of information law" OR "independent oversight and audit institutions" OR "Judicial independence" OR "lobbying reform" OR "lobbying regulation" OR "measures against corruption" OR "media and press freedom" OR "nature-related financial disclosure" OR "Ombudsman institution" OR "open data initiatives" OR "public access to environmental information" OR "public disclosure of financial information" OR "transparency requirements" OR "Whistleblower protection law"  ## Customary governance  "Community cooperation" OR "Customary institution" OR "Customary law" OR "Customary norm" OR "Customary tenure" OR "Indigenous governance" OR "Indigenous jurisdiction" OR "Intergenerational knowledge transmission" OR "Resource stewardship"  # 5) Shift underlying societal norms, philosophies, and goals to align with the 2050 Biodiversity Vision and related global sustainability goals  ## Inner change  "Behavioral change" OR "Biophilia" OR "Connection with Nature" OR "Consumption reduction" OR "Dietary transition" OR "Ecological Connection" OR "Environmental Connection" OR "Ethical consumerism" OR "Food waste reduction" OR "Inner capacity" OR "Inner development goal" OR "Identity shift" OR "Inner transformation" OR "Lifestyle change" OR "Minimalism"  OR "Personal meaning" OR "Personal transformation" OR "Simple living" OR "Sustainable practices"  ## Narrative and discourse change  "Awareness campaign" OR "Behavioral nudge" OR "Campaign on consumer goods" OR "Choice architecture" OR "Community dialogue" OR "Cultural narrative" OR "Cultural transformation" OR "Environmental discourse" OR "Environmental narrative" OR "Environmental perspective" OR "Environmental storyline" OR "Green discourse" OR "Green narrative" OR "Green perspective" OR "Green storyline" OR "Mass media campaign" OR "Normative feedback" OR "Nudging" OR "Peer-to-peer communication" OR "Regenerative culture" OR "Social media platform" OR "Storytelling initiative" OR "Unitive narrative" OR "Youth empowerment program"  ## Transformative learning  "Adult learning" OR "Capacity building" OR "Capacity development" OR "Cultural exchange program" OR "Cultural revitalization" OR "Environmental curriculum" OR "Environmental education" OR "Experiential learning" OR "Experiential teaching" OR "Imagination infrastructure" OR "Indigenous education" OR "Practical learning" OR "Sacred teaching" OR "Social learning" OR "Solution space" OR "Transformation lab" OR "Transformative learning" OR "Transformational learning" OR "Unitive education"  ## Knowledge co-creation  "Art-science collaboration" OR "Co-creative inquiry" OR "Co-creation of knowledge" OR "Co-design" OR "Collaborative knowledge production" OR "Collaborative research and learning" OR "Collective knowledge generation" OR "Interfaith collaboration" OR "Interfaith dialogue" OR "Joint knowledge development" OR "Jointly constructed knowledge" OR "Knowledge co-creation" OR "Knowledge co-design" OR "Participatory knowledge creation" OR "Participatory research and development" OR "Multiple evidence-based approach" OR "Weaving knowledge"  ## Value change  "Balanced relation" OR "Caring for nature" OR "Community health" OR "Connection to nature" OR "Cultural preservation" OR "Cultural pluralism" OR "Cultural revitalization" OR "Eco-centrism" OR "Ecohealth" OR "Environmental stewardship" OR "Harmony with nature" OR "Holistic worldview" OR "Human-nature connection" OR "Human-nature relation" OR "Intrinsic value" OR "Interconnectedness of all life forms" OR "Indigenous worldview" OR "One health" OR "Planetary health" OR "Planetary wellbeing" OR "Relationality" OR "Relational values" OR "Respect for Diversity" OR "Spiritual connection" OR "Unitive vision" OR "Utilitarian value" OR "Water-energy-food nexus"  ## Collaboration and networking  "Boundary organization" OR "Boundary spanner" OR "Change agent" OR "Civic engagement initiative" OR "Collaborative initiative" OR "Community bond" OR "Community network" OR "Community solidarity" OR "Connector" OR "Facilitator" OR "Indigenous peoples network" OR "Innovation broker" OR "Intermediary" OR "Knowledge network" OR "Learning network" OR "Middle actor" OR "Multi-stakeholder platform" OR "New collaborative setting" OR "Partnership network" OR "Policy network" OR "Respectful partnership" OR "Technology network" OR "Transition intermediary"

Chapter 5

Vision

Show the code
#|

cat(params$s_1_ch5_vision)

Case

Show the code
#|

cat(params$s_1_case)
"case analysis" OR
"case report" OR
"detailed analysis" OR
"example examination" OR
"research case" OR
"instance evaluation" OR
"illustrative example" OR
"empirical investigation" OR
"subject study" OR
"profile analysis" OR
"specific study" OR
"prototype study" OR
"field study" OR
"observational study" OR
"practical example" OR
"exploratory study" OR
"diagnostic study" OR
"experimental study" OR
"investigative study" OR
"in-depth study" OR
"case study" OR
"case-based research" OR
"real-world example" OR
"real-life example" OR
"real-life case" OR
"fieldwork" OR
"empirical research" OR
"empirical case" OR
"Illustrative case" OR
"concrete case" OR
"observational research" OR
"cross-sectional study" OR
"multisite ethnography" OR
"ethnography"

Vision & Case

Topics

OpenAlex assigns topics to each work in a hirarchical manner:

Please see here for more information and here for a complete list of all topics and their corresponding subfields, fields and domains.

Methods

Get and calculate Data from OpenAlex

These data is gathered from OpenAlex directly, not using the downloaded TCA Corpus. The data is used to assess the quality of the TCA Corpus.

Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "search_term_hits.rds")
if (!file.exists(fn)) {
    s_t <- grep("s_1_", names(params), value = TRUE)
    search_term_hits <- parallel::mclapply(
        s_t,
        function(stn) {
            message("getting '", stn, "' ...")
            if (grepl("_f_", stn)) {
                search <- params[[stn]]()
            } else {
                search <- params[[stn]]
            }
            search <- compact(search)
            openalexR::oa_query(filter = list(title_and_abstract.search = search)) |>
                openalexR::oa_request(count_only = TRUE, verbose = TRUE) |>
                unlist()
        },
        mc.cores = params$mc.cores,
        mc.preschedule = FALSE
    ) |>
        do.call(what = cbind) |>
        t() |>
        as.data.frame() |>
        dplyr::mutate(page = NULL, per_page = NULL) |>
        dplyr::mutate(count = formatC(count, format = "f", big.mark = ",", digits = 0))

    rownames(search_term_hits) <- s_t |>
        gsub(pattern = "s_1_", replacement = "") |>
        gsub(pattern = "f_", replacement = "") |>
        gsub(pattern = "^ch", replacement = "Chapter ") |>
        gsub(pattern = "_", replacement = " ")

    saveRDS(search_term_hits, file = fn)
} else {
    search_term_hits <- readRDS(fn)
}
Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "additional_search.rds")
if (!file.exists(fn)) {
    # oa
    st <- params$s_1_tca_corpus |>
        compact()

    count_all <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    # art
    st <- paste0("(", params$s_1_tca_corpus, ") AND (", params$st_art, ")") |>
        compact()
    count <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    result <- data.frame(
        Category = "Art",
        Count = count,
        Proportion = count / count_all,
        Timestamp = Sys.time()
    )

    # media
    st <- paste0("(", params$s_1_tca_corpus, ") AND (", params$st_media, ")") |>
        compact()

    count <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    result <- rbind(
        result,
        data.frame(
            Category = "Media",
            Count = count,
            Proportion = count / count_all,
            Timestamp = Sys.time()
        )
    )

    # imaginative
    st <- paste0("(", params$s_1_tca_corpus, ") AND (", params$st_imaginative, ")") |>
        compact()

    count <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    result <- rbind(
        result,
        data.frame(
            Category = "Imaginative",
            Count = count,
            Proportion = count / count_all,
            Timestamp = Sys.time()
        )
    )

    # Rights of Nature
    st <- paste0("(", params$s_1_tca_corpus, ") AND (", params$st_rights_of_nature, ")") |>
        compact()

    count <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    result <- rbind(
        result,
        data.frame(
            Category = "Rights of Nature",
            Count = count,
            Proportion = count / count_all,
            Timestamp = Sys.time()
        )
    )

    # Initiative
    st <- paste0("(", params$s_1_tca_corpus, ") AND (", params$st_initiative, ")") |>
        compact()

    count <- openalexR::oa_fetch(title_and_abstract.search = st, count_only = TRUE, verbose = TRUE, output = "list")$count

    result <- rbind(
        result,
        data.frame(
            Category = "Initiative",
            Count = count,
            Proportion = count / count_all,
            Timestamp = Sys.time()
        )
    )

    # save it
    saveRDS(result, file = fn)
}
Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "key_papers.rds")
if (!file.exists(fn)) {
    key_papers <- lapply(
        params$key_papers,
        function(fn) {
            message("Processing '", fn, "' ...")
            sapply(
                fn,
                function(x) {
                    read.csv(x) |>
                        select(DOI)
                }
            ) |>
                unlist()
        }
    )
    names(key_papers) <- gsub("\\.csv", "", basename(params$key_papers))

    key_papers <- list(
        Ch_1 = unlist(key_papers[grepl("Ch 1 -", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_2 = unlist(key_papers[grepl("Ch 2 -", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3_Cl_1 = unlist(key_papers[grepl("Ch 3 - Cl1", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3_Cl_3 = unlist(key_papers[grepl("Ch 3 - Cl3", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3_Cl_4 = unlist(key_papers[grepl("Ch 3 - Cl4", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3_Cl_5 = unlist(key_papers[grepl("Ch 3 - Cl5", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3_Cl_6 = unlist(key_papers[grepl("Ch 3 - Cl6", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_3 = unlist(key_papers[grepl("Ch 3 - p", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_4_Cl_1 = unlist(key_papers[grepl("Ch 4 - Challenge 1", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_4_Cl_2 = unlist(key_papers[grepl("Ch 4 - Challenge 2", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_4_Cl_3 = unlist(key_papers[grepl("Ch 4 - Challenge 3", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_4_Cl_4 = unlist(key_papers[grepl("Ch 4 - Challenge 4", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_4_Cl_5 = unlist(key_papers[grepl("Ch 4 - Challenge 5", names(key_papers))], recursive = FALSE) |> as.vector(),
        Ch_5 = unlist(key_papers[grepl("Ch 5 -", names(key_papers))], recursive = FALSE) |> as.vector()
    )

    saveRDS(key_papers, file = fn)
} else {
    key_papers <- readRDS(fn)
}
Show the code
#|

fn_kw <- file.path(".", "data", "tca_corpus", "key_works.rds")
fn_kw_df <- file.path(".", "data", "tca_corpus", "key_works_df.rds")
if (!all(file.exists(fn_kw, fn_kw_df))) {
    key_works <- parallel::mclapply(
        key_papers,
        function(kp) {
            dois <- kp[kp != ""] |>
                unlist() |>
                tolower() |>
                unique()

            openalexR::oa_fetch(doi = dois, output = "list")
        },
        mc.cores = params$mc.cores,
        mc.preschedule = FALSE
    )

    found <- sapply(
        key_works,
        function(x) {
            length(x) > 0
        }
    )

    key_works <- key_works[found]

    print("The following key paper sets were excluded as they contained no papers in OpenAlex:\n")
    print(names(found)[!found])

    saveRDS(key_works, file = fn_kw)

    key_works_df <- lapply(
        key_works,
        oa2df,
        entity = "works"
    )

    saveRDS(key_works_df, fn_kw_df)
} else {
    key_works <- readRDS(file = fn_kw)
    key_works_df <- readRDS(fn_kw_df)
}
Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "key_works_hits.rds")
if (!file.exists(fn)) {
    kws <- key_works_df
    kws$all <- key_works_df |>
        bind_rows()

    nms <- names(kws)

    key_works_hits <- pbapply::pblapply(
        nms,
        function(nm) {
            message("Getting key paper set for ", nm, " ...")
            dois <- kws[[nm]] |>
                select(doi) |>
                distinct() |>
                unlist() |>
                unique() |>
                tolower()

            s_t <- grep("s_1_", names(params), value = TRUE)
            kw_h <- parallel::mclapply(
                s_t,
                function(stn) {
                    message("  getting '", stn, "' ...")
                    if (grepl("_f_", stn)) {
                        search <- compact(params[[stn]]())
                    } else {
                        search <- compact(params[[stn]])
                    }
                    get_count(dois = dois, list(title_and_abstract.search = search), verbose = FALSE)
                },
                mc.cores = params$mc.cores,
                mc.preschedule = FALSE
            ) |>
                do.call(what = cbind) |>
                as.data.frame()
            message("Done")

            names(kw_h) <- s_t

            # if (ncol(kw_h) == 1){
            #     kw_h <- t(kw_h)
            #     rownames(kw_h) <- dois
            # }

            kw_h <- rbind(
                kw_h,
                colSums(kw_h)
            )

            rownames(kw_h)[[nrow(kw_h)]] <- "Total"
            return(kw_h)
        }
    )

    names(key_works_hits) <- nms

    for (i in nms) {
        # key_works_hits[[i]] <- cbind(
        #     key_works_hits[[i]],
        #     key_works_hits_tca_filtered[[i]]
        # )

        key_works_hits[[i]] <- cbind(
            key_works_hits[[i]],
            Total = rowSums(key_works_hits[[i]])
        ) |>
            mutate(Total = Total - 1) # |>
        # relocate(tca_corpus_SDG, .after = s_1_tca_corpus)
    }

    ###

    saveRDS(key_works_hits, file = fn)
} else {
    key_works_hits <- readRDS(file = fn)
}

Works over Time

Get works over time for different search terms

Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "oa_count.rds")
if (!file.exists(fn)) {
    oa_count <- list(
        timestamp = Sys.time()
    )
    #
    message("OpenAlex ...")
    oa_count$oa_years <- openalexR::oa_fetch(
        entity = "works",
        search = "",
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    #
    message("NATURE ...")
    oa_count$tca_nature <- openalexR::oa_fetch(
        title_and_abstract.search = compact(paste0("(", params$s_1_nature_environment, ")")),
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    #
    message("TransformatveChange ...")
    oa_count$transformative_change_years <- openalexR::oa_fetch(
        title_and_abstract.search = compact(paste0("(", params$s_1_transformative_change, ")")),
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    #
    message("TCA ...")
    oa_count$tca_years <- openalexR::oa_fetch(
        title_and_abstract.search = compact(paste0("(", params$s_1_tca_corpus, ")")),
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    #
    message("CASE ...")
    oa_count$case_years <- openalexR::oa_fetch(
        title_and_abstract.search = compact(paste0("(", params$s_1_case, ")")),
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    #
    message("TCA AND CASE ...")
    oa_count$tca_case_years <- openalexR::oa_fetch(
        title_and_abstract.search = compact(paste0("(", params$s_1_tca_corpus, ") AND (", params$s_1_case, ")")),
        group_by = "publication_year",
        output = "dataframe",
        verbose = TRUE
    ) |>
        dplyr::mutate(
            publication_year = as.integer(as.character(key_display_name)),
            key = NULL,
            key_display_name = NULL,
            p = count / sum(count)
        ) |>
        dplyr::arrange(publication_year) |>
        dplyr::mutate(
            p_cum = cumsum(p)
        ) |>
        dplyr::select(
            publication_year,
            everything()
        )
    saveRDS(oa_count, file = fn)
}

Download TCA Corpus

The corpus download will be stored in data/pages and the arrow database in data/corpus.

This is not on github!

The corpus can be read by running get_corpus() which o[pens the database so that then it can be fed into a dplyr pipeline. After most dplyr functions, the actual data needs to be collected via collect().

Only then is the actual data read!

Needs to be enabled by setting eval: true in the code block below.

Show the code
#|

tic()

IPBES.R::corpus_download(
    pages_dir = params$pages_dir,
    title_and_abstract_search = compact(params$s_1_tca_corpus),
    continue = TRUE,
    delete_pages_dir = FALSE,
    set_size = 2000,
    dry_run = FALSE,
    verbose = TRUE,
    mc_cores = 6
)

toc()
Show the code
tic()

IPBES.R::corpus_pages_to_arrow(
    pages_dir = params$pages_dir,
    arrow_dir = params$corpus_dir,
    continue = TRUE,
    delete_arrow_dir = FALSE,
    dry_run = FALSE,
    verbose = TRUE,
    mc_cores = 2
)

toc()
Show the code
#|

years <- IPBES.R::corpus_read(params$corpus_dir) |>
    distinct(publication_year) |>
    collect() |>
    unlist() |>
    as.vector() |>
    sort()

lapply(
    years,
    function(y) {
        message("\nProcessing year: ", y)
        tic()
        dataset <- IPBES.R::corpus_read(params$corpus_dir) |>
            dplyr::filter(publication_year == y) |>
            dplyr::collect() |>
            group_by(id) |>
            slice_max(
                publication_year,
                n = 1,
                with_ties = FALSE,
                na_rm = TRUE
            )
        unlink(
            file.path(params$corpus_dir, paste0("publication_year=", y)),
            recursive = TRUE,
            force = TRUE
        )
        arrow::write_dataset(
            dataset = dataset,
            path = params$corpus_dir,
            partitioning = c("publication_year", "set"),
            format = "parquet",
            existing_data_behavior = "overwrite"
        )
        toc()
    }
)

Download TCA AND CASE Corpus

Show the code
#|

tic()

IPBES.R::corpus_download(
    pages_dir = params$pages_cases_dir,
    title_and_abstract_search = compact(paste(params$s_1_tca_corpus, " AND (", params$s_1_case, ")")),
    continue = TRUE,
    delete_pages_dir = FALSE,
    set_size = 2000,
    dry_run = TRUE,
    verbose = TRUE,
    mc_cores = 6
)

toc()
Show the code
tic()

IPBES.R::corpus_pages_to_arrow(
    pages_dir = params$pages_cases_dir,
    arrow_dir = params$corpus_cases_dir,
    continue = TRUE,
    delete_arrow_dir = FALSE,
    dry_run = FALSE,
    verbose = TRUE,
    mc_cores = 2
)

toc()
Show the code
#|

years <- IPBES.R::corpus_read(params$corpus_cases_dir) |>
    distinct(publication_year) |>
    collect() |>
    unlist() |>
    as.vector() |>
    sort()

lapply(
    years,
    function(y) {
        message("\nProcessing year: ", y)
        tic()
        dataset <- IPBES.R::corpus_read(params$corpus_cases_dir) |>
            dplyr::filter(publication_year == y) |>
            dplyr::collect() |>
            group_by(id) |>
            slice_max(
                publication_year,
                n = 1,
                with_ties = FALSE,
                na_rm = TRUE
            )
        unlink(
            file.path(params$corpus_cases_dir, paste0("publication_year=", y)),
            recursive = TRUE,
            force = TRUE
        )
        arrow::write_dataset(
            dataset = dataset,
            path = params$corpus_cases_dir,
            partitioning = c("publication_year", "set"),
            format = "parquet",
            existing_data_behavior = "overwrite"
        )
        toc()
    }
)

Prepare Full Text search of Title and Abstract

This is done using duckDB and the fts extension which is a full text search extension for duckDB (see also for details and for arrow / parquet support).

The following steps are conducted:

  1. Create new duckDB called tca_corpus.duckdb
    • import data needed
    • create fts index for full text search
Show the code
if (!file.exists(params$duckdb_fn)) {
    sql <- paste0(
        "CREATE TABLE tca_corpus AS SELECT id, author_abbr, publication_year, doi, display_name, ab FROM parquet_scan('",
        file.path(".", "data", "tca_corpus", "corpus", "**", "*.parquet"),
        "')"
    )

    con <- duckdb::dbConnect(duckdb::duckdb(), dbdir = params$duckdb_fn, read_only = FALSE)
    #
    dbExecute(con, "SET autoinstall_known_extensions=1")
    dbExecute(con, "SET autoload_known_extensions=1")
    dbExecute(con, sql)
    #
    duckdb::dbDisconnect(con, shutdown = TRUE)

    con <- duckdb::dbConnect(duckdb::duckdb(), dbdir = params$duckdb_fn, read_only = FALSE)
    #
    dbExecute(con, "INSTALL fts")
    dbExecute(con, "LOAD fts")

    input_table <- "tca_corpus"
    input_id <- "id"
    input_values <- "'display_name', 'ab'"

    sql <- paste0("PRAGMA create_fts_index(", input_table, ", ", input_id, ", ", input_values, ", overwrite=1);")

    dbExecute(con, sql)
    #
    duckdb::dbDisconnect(con, shutdown = TRUE)
}

# con <- dbConnect(duckdb::duckdb(params$duckdb_fn))

# SQL <- "SELECT * FROM tca_corpus WHERE display_name MATCH 'transformative';"
# dbListTables(con)

#     input_table <- "tca_corpus"
#     input_id <- "id"
#     input_values <- "'display_name', 'ab'"

#     query_string <- "'case study'"
#     fields <- "'display_name', 'ab'"

# sql <- paste0("SELECT fts_main_tca_corpus.match_bm25(", input_id, ", ", query_string, ", fields = ", fields, " FROM tca_corpus)"

# dbExecute(con, sql)

# duckdb::dbDisconnect(con, shutdown = TRUE)

Extract Data from Global Corpus

Export Random Works from TCA Cases Corpus

Show the code
#|

sample_size <- 250

fn <- file.path("data", "tca_corpus", paste0("random_", sample_size, "_tca_cases_corpus.xlsx"))
if (!file.exists(fn)) {
    set.seed(13)
    read_corpus(params$corpus_cases_dir) |>
        dplyr::select(
            id,
            doi,
            author = author_abbr,
            title = display_name,
            abstract = ab
        ) |>
        dplyr::slice_sample(
            n = sample_size
        ) |>
        dplyr::mutate(
            abstract = substr(abstract, 1, 5000)
        ) |>
        dplyr::collect() |>
        writexl::write_xlsx(path = fn)
}

Sectors

The Sectors definition is based on the subfields assigned to each work by OpenAlex. These were grouped by experts into sectors. See this Google Doc for details.

Show the code
#|

if (!dir.exists(params$corpus_topics_dir)) {
    con <- duckdb::dbConnect(duckdb::duckdb(), read_only = FALSE)

    corpus_read(params$corpus_dir) |>
        arrow::to_duckdb(table_name = "corpus", con = con) |>
        invisible()
    corpus_read(file.path("input", "tca_corpus", "sectors_def.parquet")) |>
        arrow::to_duckdb(table_name = "sectors", con = con) |>
        invisible()

    paste0(
        "CREATE VIEW corpus_unnest AS ",
        "SELECT  ",
        "corpus.id AS work_id,  ",
        "corpus.publication_year AS publication_year,  ",
        "UNNEST(topics).i AS i,  ",
        "UNNEST(topics).score AS score,  ",
        "UNNEST(topics).name AS name, ",
        "UNNEST(topics).id AS id,  ",
        "UNNEST(topics).display_name AS display_name  ",
        "FROM  ",
        "corpus "
    ) |>
        dbExecute(conn = con)

    select_sql <- paste0(
        "SELECT ",
        "corpus_unnest.*, ",
        "sectors.sector ",
        "FROM ",
        "corpus_unnest ",
        "LEFT JOIN ",
        "sectors ",
        "ON ",
        "corpus_unnest.id  == sectors.id "
    )

    dbGetQuery(con, paste(select_sql, "LIMIT 10"))

    sql <- paste0(
        "COPY ( ",
        select_sql,
        ") TO '", params$corpus_topics_dir, "' ",
        "(FORMAT PARQUET, COMPRESSION 'SNAPPY', PARTITION_BY 'publication_year')"
    )

    dbExecute(con, sql)

    duckdb::dbDisconnect(con, shutdown = TRUE)

    ###########################

    # years <- IPBES.R::corpus_read(params$corpus_dir) |>
    #     distinct(publication_year) |>
    #     collect() |>
    #     unlist() |>
    #     as.vector() |>
    #     sort()

    # sectors <- read.csv(file.path("input", "tca_corpus", "sectors_def.csv")) |>
    #     tibble::as_tibble() |>
    #     dplyr::mutate(
    #         id = paste0("https://openalex.org/subfields/", id),
    #         display_name = NULL
    #     )

    # pbmcapply::pbmclapply(
    #     years,
    #     function(y) {
    #         message("\nProcessing year: ", y)
    #         IPBES.R::corpus_read(params$corpus_dir) |>
    #             dplyr::filter(publication_year == y) |>
    #             dplyr::select(
    #                 id,
    #                 publication_year,
    #                 topics
    #             ) |>
    #             collect() |>
    #             IPBES.R::extract_topics(
    #                 names = "subfield"
    #             ) |>
    #             dplyr::left_join(
    #                 y = sectors,
    #                 by = "id"
    #             ) |>
    #             arrow::write_dataset(
    #                 path = params$corpus_topics_dir,
    #                 partitioning = c("publication_year"),
    #                 format = "parquet",
    #                 existing_data_behavior = "overwrite"
    #             )
    #     },
    #     mc.cores = 3,
    #     mc.preschedule = FALSE
    # )
}

Authors

Show the code
#|

if (!dir.exists(params$corpus_authors_dir)) {
    con <- duckdb::dbConnect(duckdb::duckdb(), read_only = FALSE)

    corpus_read(params$corpus_dir) |>
        arrow::to_duckdb(table_name = "corpus", con = con) |>
        invisible()

    paste0(
        "CREATE VIEW corpus_unnest AS ",
        "SELECT  ",
        "corpus.id AS work_id,  ",
        "corpus.publication_year AS publication_year,  ",
        "UNNEST(author).au_id AS au_id,  ",
        "UNNEST(author).au_display_name AS au_display_name, ",
        "UNNEST(author).au_orcid AS au_orcid,  ",
        "UNNEST(author).author_position AS author_position,  ",
        "UNNEST(author).is_corresponding AS is_corresponding,  ",
        "UNNEST(author).au_affiliation_raw AS au_affiliation_raw,  ",
        "UNNEST(author).institution_id AS institution_id,  ",
        "UNNEST(author).institution_display_name AS institution_display_name,  ",
        "UNNEST(author).institution_ror AS institution_ror,  ",
        "UNNEST(author).institution_country_code AS institution_country_code,  ",
        "UNNEST(author).institution_type AS institution_type,  ",
        "UNNEST(author).institution_lineage AS institution_lineage  ",
        "FROM  ",
        "corpus "
    ) |> dbExecute(conn = con)

    paste0(
        "COPY ( ",
        "SELECT * FROM corpus_unnest ",
        ") TO '", params$corpus_authors_dir, "' ",
        "(FORMAT PARQUET, COMPRESSION 'SNAPPY', PARTITION_BY 'publication_year')"
    ) |>
        dbExecute(conn = con)

    duckdb::dbDisconnect(con, shutdown = TRUE)
}

Primary Topics

Show the code
fn <- file.path(".", "data", "tca_corpus", paste0("prim_topics_tca_corpus.rds"))
if (!file.exists(fn)) {
    prim_topics_tca_corpus <- corpus_read(params$corpus_topics_dir) |>
        dplyr::filter(
            name == "topic",
            i == 1
        ) |>
        mutate(
            id = as.integer(sub("https://openalex.org/T", "", id))
        ) |>
        dplyr::group_by(id) |>
        summarize(
            count = n()
        ) |>
        dplyr::left_join(
            read.csv(file.path("input", "tca_corpus", "OpenAlex_topic_mapping_table - final_topic_field_subfield_table.csv")),
            by = c("id" = "topic_id")
        ) |>
        dplyr::arrange(desc(count)) |>
        collect()

    saveRDS(prim_topics_tca_corpus, file = fn)
} else {
    prim_topics_tca_corpus <- readRDS(fn)
}

Figures

Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "publications_over_time_tca_corpus.rds")

if (!file.exists(fn)) {
    read_corpus(params$corpus_dir) |>
        dplyr::select(publication_year) |>
        dplyr::arrange(publication_year) |>
        dplyr::collect() |>
        table() |>
        as.data.frame() |>
        mutate(
            publication_year = as.integer(as.character(publication_year)),
            p = Freq / sum(Freq),
            p_cum = cumsum(p)
        ) |>
        rename(
            count = Freq
        ) |>
        dplyr::inner_join(
            y = openalexR::oa_fetch(
                search = "",
                group_by = "publication_year",
                output = "tibble",
                verbose = FALSE
            ) |>
                dplyr::select(
                    key,
                    count
                ) |>
                dplyr::rename(
                    publication_year = key,
                    count_oa = count
                ) |>
                dplyr::arrange(publication_year) |>
                dplyr::mutate(
                    publication_year = as.integer(as.character(publication_year)),
                    p_oa = count_oa / sum(count_oa),
                    p_oa_cum = cumsum(p_oa)
                )
        ) |>
        saveRDS(file = fn)
}
Show the code
#|

if (length(list.files(file.path("figures", "tca_corpus"), pattern = "publications_over_time")) < 2) {
    figure <- readRDS(file.path(".", "data", "tca_corpus", "publications_over_time_tca_corpus.rds")) |>
        dplyr::filter(publication_year >= 1900) |>
        ggplot() +
        geom_bar(aes(x = publication_year, y = p), stat = "identity") +
        geom_line(aes(x = publication_year, y = p_cum / 10), color = "red") +
        geom_line(aes(x = publication_year, y = p_oa_cum / 10), color = "blue") +
        scale_x_continuous(breaks = seq(1900, 2020, 10)) +
        scale_y_continuous(
            "Proportion of publications",
            sec.axis = sec_axis(~ . * 10, name = "Cumulative proportion") # divide by 100 to scale back the secondary axis
        ) +
        labs(
            title = "Publications over time",
            x = "Year",
            y = "Number of publications"
        ) +
        theme_minimal() +
        theme(axis.text.y.right = element_text(color = "red"))

    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "publications_over_time.pdf"),
        width = 12,
        height = 6,
        figure
    )
    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "publications_over_time.png"),
        width = 12,
        height = 6,
        figure
    )

    rm(figure)
}

Maps

Show the code
#|

fn <- file.path(".", "data", "tca_corpus", "countries_tca_corpus.rds")
if (!file.exists(fn)) {
    corpus <- corpus_read(params$corpus_authors_dir)

    data_first <- corpus |>
        dplyr::filter(
            author_position == "first"
        ) |>
        dplyr::select(
            work_id,
            institution_country_code,
        ) |>
        dplyr::group_by(
            work_id,
            institution_country_code
        ) |>
        dplyr::summarise(
            count_first = 1 / n(),
            .groups = "drop"
        ) |>
        dplyr::group_by(
            institution_country_code
        ) |>
        dplyr::summarise(
            count = sum(count_first),
            .groups = "drop"
        ) |>
        dplyr::mutate(
            position = "first"
        )

    data_all <- corpus |>
        dplyr::select(
            work_id,
        ) |>
        dplyr::group_by(
            work_id,
        ) |>
        dplyr::summarize(
            count = n()
        ) |>
        dplyr::right_join(
            y = corpus |>
                dplyr::select(
                    work_id,
                    institution_country_code
                ),
            by = "work_id"
        ) |>
        dplyr::group_by(
            institution_country_code
        ) |>
        dplyr::summarise(
            count = sum(count),
            .groups = "drop"
        ) |>
        dplyr::mutate(
            position = "all"
        )

    data_oa <- openalexR::oa_fetch(
        group_by = "authorships.countries",
        output = "tibble",
        verbose = FALSE
    ) |>
        dplyr::mutate(
            iso3c = countrycode::countrycode(
                key_display_name,
                origin = "country.name",
                destination = "iso3c"
            ),
            key_display_name = NULL,
            key = NULL,
            position = "oa"
        )

    data <- dplyr::add_row(
        collect(data_first),
        collect(data_all)
    ) |>
        dplyr::mutate(
            iso3c = countrycode::countrycode(
                institution_country_code,
                origin = "iso2c",
                destination = "iso3c"
            ),
            institution_country_code = NULL
        ) |>
        dplyr::add_row(
            data_oa
        ) |>
        saveRDS(file = fn)
    rm(data_first, data_all, data_oa)
}

Some check of the data

Show the code
#|

if (length(list.files(path = file.path("maps", "tca_corpus"), pattern = "publications_countries")) < 2) {
    data <- readRDS(file.path(".", "data", "tca_corpus", "countries_tca_corpus.rds")) |>
        dplyr::group_by(iso3c) |>
        dplyr::summarize(
            count_first = sum(count[position == "first"], na.rm = TRUE),
            count_all = sum(count[position == "all"], na.rm = TRUE),
            count_oa = sum(count[position == "oa"], na.rm = TRUE)
        ) |>
        dplyr::mutate(
            count_oa = ifelse(is.na(count_oa), 0, count_oa),
            log_count_oa = log(count_oa + 1),
            p_oa = count_oa / sum(count_oa),
            #
            count_first = ifelse(is.na(count_first), 0, count_first),
            log_count_first = log(count_first + 1),
            p_first = count_first / sum(count_first),
            p_first_output = count_first / count_oa,
            p_first_diff = (p_oa - p_first) * 100,
            #
            count_all = ifelse(is.na(count_all), 0, count_all),
            log_count_all = log(count_all + 1),
            p_all = count_all / sum(count_all),
            p_all_output = count_all / count_oa,
            p_all_diff = (p_oa - p_all) * 100,
        )

    # data |> mutate(
    #     count_first = count_first / max(count_first),
    #     count_all = count_all / max(count_all),
    #     count_oa = count_oa / max(count_oa)
    # ) |>
    # dplyr::arrange(desc(count_oa)) |>
    # ggplot(aes(x = iso3c)) +
    #     geom_line(aes(y = count_first, color = "Count First"), group = 1) +
    #     geom_line(aes(y = count_all, color = "Count All"), group = 1) +
    #     geom_line(aes(y = count_oa, color = "Count OA"), group = 1) +
    #     scale_color_manual(values = c("Count First" = "red", "Count All" = "blue", "Count OA" = "green")) +
    #     labs(x = "ISO3C", y = "Normalized Count") +
    #     theme_minimal()

    map <- patchwork::wrap_plots(
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of overall publications (count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of overall publications (log_count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("Overall research output (p_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_all)"),
        ####
        ggplot() +
            theme_void(),
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_all)"),
        ncol = 3
    )

    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries.pdf"),
        width = 12,
        height = 8,
        map
    )
    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries.png"),
        width = 12,
        height = 8,
        map
    )
}
Show the code
if (length(list.files(path = file.path("maps", "tca_corpus"), pattern = "publications_countries_before_2016")) < 2) {
    data <- readRDS(file.path(".", "data", "tca_corpus", "countries_tca_corpus.rds")) |>
        dplyr::filter(
            publication_year < 2016
        ) |>
        dplyr::group_by(iso3c) |>
        dplyr::summarize(
            count_first = sum(as.integer(count_first), na.rm = TRUE),
            count_all = sum(as.integer(count_all), na.rm = TRUE),
            count_oa = sum(as.integer(count_oa), na.rm = TRUE),
        ) |>
        dplyr::mutate(
            count_oa = ifelse(is.na(count_oa), 0, count_oa),
            log_count_oa = log(count_oa + 1),
            p_oa = count_oa / sum(count_oa),
            #
            count_first = ifelse(is.na(count_first), 0, count_first),
            log_count_first = log(count_first + 1),
            p_first = count_first / sum(count_first),
            p_first_output = count_first / count_oa,
            p_first_diff = (p_oa - p_first) * 100,
            #
            count_all = ifelse(is.na(count_all), 0, count_all),
            log_count_all = log(count_all + 1),
            p_all = count_all / sum(count_all),
            p_all_output = count_all / count_oa,
            p_all_diff = (p_oa - p_all) * 100,
        )

    map <- patchwork::wrap_plots(
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of overall publications (count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of overall publications (log_count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("Overall research output (p_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_all)"),
        ####
        ggplot() +
            theme_void(),
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_all)"),
        ncol = 3
    )

    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries_before_2016.pdf"),
        width = 12,
        height = 8,
        map
    )
    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries_before_2016.png"),
        width = 12,
        height = 8,
        map
    )
}
Show the code
if (length(list.files(path = file.path("maps", "tca_corpus"), pattern = "publications_countries_after_2019")) < 2) {
    data <- readRDS(file.path(".", "data", "tca_corpus", "countries_tca_corpus.rds")) |>
        dplyr::filter(
            publication_year > 2019
        ) |>
        dplyr::group_by(iso3c) |>
        dplyr::summarize(
            count_first = sum(as.integer(count_first), na.rm = TRUE),
            count_all = sum(as.integer(count_all), na.rm = TRUE),
            count_oa = sum(as.integer(count_oa), na.rm = TRUE),
        ) |>
        dplyr::mutate(
            count_oa = ifelse(is.na(count_oa), 0, count_oa),
            log_count_oa = log(count_oa + 1),
            p_oa = count_oa / sum(count_oa),
            #
            count_first = ifelse(is.na(count_first), 0, count_first),
            log_count_first = log(count_first + 1),
            p_first = count_first / sum(count_first),
            p_first_output = count_first / count_oa,
            p_first_diff = (p_oa - p_first) * 100,
            #
            count_all = ifelse(is.na(count_all), 0, count_all),
            log_count_all = log(count_all + 1),
            p_all = count_all / sum(count_all),
            p_all_output = count_all / count_oa,
            p_all_diff = (p_oa - p_all) * 100,
        )

    map <- patchwork::wrap_plots(
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of overall publications (count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("count of TCA publications (count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of overall publications (log_count_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "log_count_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("log(count + 1) of TCA publications (log_count_all)"),
        ####
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_oa",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("Overall research output (p_oa)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", high = "#56B4E9") +
            ggplot2::ggtitle("TCA research output (p_all)"),
        ####
        ggplot() +
            theme_void(),
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_first_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_first)"),
        #
        data |>
            IPBES.R::map_country_codes(
                map_type = "countries",
                values = "p_all_diff",
                geodata_path = params$gdm_dir
            ) +
            ggplot2::scale_fill_gradient2(low = "#E69F00", mid = "white", high = "#56B4E9", midpoint = 0) +
            ggplot2::ggtitle("difference (TCA - overall) output (p_oa - p_all)"),
        ncol = 3
    )

    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries_after_2019.pdf"),
        width = 12,
        height = 8,
        map
    )
    ggplot2::ggsave(
        file.path("maps", "tca_corpus", "publications_countries_after_2019.png"),
        width = 12,
        height = 8,
        map
    )
}

Topics and Sectors

Show the code
#|

fn <- file.path("data", "tca_corpus", "sectors_over_time.rds")
if (!file.exists(fn)) {
    data <- IPBES.R::corpus_read(params$corpus_topics_dir) |>
        dplyr::filter(
            name == "subfield"
        ) |>
        dplyr::group_by(
            publication_year,
            sector,
            i
        ) |>
        dplyr::summarize(
            count = n(),
            .groups = "drop"
        ) |>
        dplyr::rename(
            level = i
        ) |>
        dplyr::collect()

    data |>
        dplyr::filter(
            level == 1
        ) |>
        dplyr::group_by(
            publication_year,
            sector
        ) |>
        dplyr::summarize(
            count_1 = sum(count),
            .groups = "drop"
        ) |>
        dplyr::full_join(
            data |>
                dplyr::group_by(
                    publication_year,
                    sector
                ) |>
                dplyr::summarize(
                    count_all = sum(count)
                )
        ) |>
        dplyr::arrange(
            publication_year,
            sector
        ) |>
        dplyr::mutate(
            count_1 = ifelse(is.na(count_1), 0, count_1),
            count_all = ifelse(is.na(count_all), 0, count_all)
        ) |>
        dplyr::group_by(sector) |>
        dplyr::mutate(
            cumsum_count_1 = cumsum(count_1),
            cumsum_count_all = cumsum(count_all),
            p_cumsum_count_1 = cumsum_count_1 / max(cumsum_count_1),
            p_cumsum_count_all = cumsum_count_all / max(cumsum_count_all)
        ) |>
        saveRDS(fn)
    rm(data)
}
Show the code
#|

if (length(list.files(file.path("figures", "tca_corpus"), pattern = "sectors_over_time")) < 2) {
    figure_1 <- readRDS(file.path(file.path("data", "tca_corpus", "sectors_over_time.rds"))) |>
        dplyr::filter(
            publication_year >= 1950
        ) |>
        ggplot() +
        geom_line(
            aes(
                x = publication_year,
                y = cumsum_count_1,
                color = sector,
                lty = sector
            )
        ) +
        scale_x_continuous(breaks = seq(1900, 2020, 10)) +
        scale_y_continuous(
            "Log(No Publications)",
            trans = "log10"
            # sec.axis = sec_axis(~ . * 10, name = "Cumulative proportion") # divide by 100 to scale back the secondary axis
        ) +
        labs(
            title = "Publications classified into Sectors over time (primary sector only)",
            x = "Year"
            # y = "Number of publications"
        ) +
        theme_minimal() +
        theme(
            legend.position = "bottom",
            # axis.text.y.right = element_text(color = "red")
        )

    figure_all <- readRDS(file.path(file.path("data", "tca_corpus", "sectors_over_time.rds"))) |>
        dplyr::filter(
            publication_year >= 1950
        ) |>
        ggplot() +
        geom_line(
            aes(
                x = publication_year,
                y = cumsum_count_all,
                color = sector,
                lty = sector
            )
        ) +
        scale_x_continuous(breaks = seq(1900, 2020, 10)) +
        scale_y_continuous(
            "Log(No Publications)",
            trans = "log10"
            # sec.axis = sec_axis(~ . * 10, name = "Cumulative proportion") # divide by 100 to scale back the secondary axis
        ) +
        labs(
            title = "Publications classified into Sectors over time (up to three sectors)",
            x = "Year"
            # y = "Number of publications"
        ) +
        theme_minimal() +
        theme(
            legend.position = "none",
            # axis.text.y.right = element_text(color = "red")
        )

    figure <- patchwork::wrap_plots(
        figure_1,
        figure_all,
        nrow = 2
    )

    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "sectors_over_time.pdf"),
        width = 12,
        height = 12,
        figure
    )
    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "sectors_over_time.png"),
        width = 12,
        height = 12,
        figure
    )

    rm(figure_1, figure_all, figure)
}
Show the code
#|

if (length(list.files(file.path("figures", "tca_corpus"), pattern = "sectors_proportions_over_time")) < 2) {
    figure <- readRDS(file.path(file.path("data", "tca_corpus", "sectors_over_time.rds"))) |>
        dplyr::filter(
            publication_year >= 1950
        ) |>
        group_by(publication_year) |>
        mutate(count_all = count_all / sum(count_all)) |>
        ggplot() +
        geom_col(
            aes(
                x = publication_year,
                y = count_all,
                fill = sector
            ),
            position = "stack"
        ) +
        scale_x_continuous(breaks = seq(1900, 2020, 10)) +
        scale_y_continuous(
            "Proportion of Publications" # ,
            #    limits = c(0, 1.0001)
        ) +
        labs(
            title = "Publications classified into Sectors over time. Each publication has up to three sectors assigned.",
            x = "Year",
            y = "Proportion"
        ) +
        theme_minimal() +
        theme(
            legend.position = "right"
        )

    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "sectors_proportions_over_time.pdf"),
        width = 12,
        height = 12,
        figure
    )
    ggplot2::ggsave(
        file.path("figures", "tca_corpus", "sectors_proportions_over_time.png"),
        width = 12,
        height = 12,
        figure
    )

    rm(figure)
}

Results

Assessment of Search Terms Using OpenAlex

Number of Hits per Individual Corpus

Here we show the number of hits for the key papers in the different individual corpi. The columns represent the different search terms as defined in Section 2.2.

Show the code
dat <- cbind(
    search_term_hits
)

rownames(dat) <- dplyr::recode(
    rownames(dat),
    "transformative change" = "Transformative Change @sec-transform",
    "nature environment" = "Nature @sec-nature",
    "tca corpus" = "Assessment Corpus @sec-tca-corpus",
    "Chapter 1 01" = "Ch1 01 @sec-ch1-01",
    "Chapter 1 02" = "Ch1 02 @sec-ch1-02",
    "Chapter 1 03" = "Ch1 03 @sec-ch1-03",
    "Chapter 1 04" = "Ch1 04 @sec-ch1-04",
    "Chapter 1 05" = "Ch1 05 @sec-ch1-05",
    "Chapter 1 06" = "Ch1 06 @sec-ch1-06",
    "Chapter 2" = "Ch2  @sec-ch2",
    "Chapter 3 01" = "Ch3 01 @sec-ch3-01",
    "Chapter 3 02" = "Ch3 02 @sec-ch3-02",
    "Chapter 3 03" = "Ch3 03 @sec-ch3-03",
    "Chapter 3 04" = "Ch3 04 @sec-ch3-04",
    "Chapter 3 05" = "Ch3 05 @sec-ch3-05",
    "Chapter 3 06" = "Ch3 06 @sec-ch3-06",
    "Chapter 4 01" = "Ch4 01 @sec-ch4-01",
    "Chapter 4 02" = "Ch4 02 @sec-ch4-02",
    "Chapter 5 vision" = "Ch5 Vision @sec-ch5_vision",
    "Chapter 5 vision case" = "Ch5 Vision Case @sec-ch5_vision_case",
    "case" = "Ch5 Case @sec-case"
)

dat |>
    knitr::kable(
        caption = "Number of hits",
    )
Number of hits
count db_response_time_ms
oa 253,514,060 20
Transformative Change Section 2.2.1 18,844,396 4253
Nature Section 2.2.2 26,116,505 2682
Assessment Corpus Section 2.2.3 4,720,072 4346
Ch1 01 Section 2.2.4.1 634,602 336
Ch1 02 Section 2.2.4.2 3,263,235 259
Ch1 03 Section 2.2.4.3 16,379,848 614
Ch1 04 Section 2.2.4.4 2,555,891 566
Ch1 05 Section 2.2.4.5 26,437,484 1078
Ch1 06 Section 2.2.4.6 6,595,757 752
Ch2 Section 2.2.5 111,185,757 7004
Ch3 01 Section 2.2.6.1 16,563,322 1031
Ch3 02 Section 2.2.6.2 34,107,427 1589
Ch3 03 Section 2.2.6.3 29,311,181 775
Ch3 04 Section 2.2.6.4 10,906,330 748
Ch3 05 Section 2.2.6.5 13,399,042 929
Ch3 06 Section 2.2.6.6 21,289,270 1438
Ch4 01 Section 2.2.7.1 900,528 969
Ch4 02 Section 2.2.7.2 21 709
Ch5 Case Section 2.2.11.2 56,210,784 5040
Show the code
rm(dat)

Key papers in different Individual Corpi

Show the code
#|

tbl <- lapply(
    names(key_works_hits),
    function(n) {
        kwh <- key_works_hits[[n]]
        if (nrow(kwh) > 0) {
            total <- grepl("Total", rownames(kwh))
            rownames(kwh)[!total] <- paste0(n, " - <a href='https://doi.org/", rownames(kwh)[!total], "' target='_blank'>Click here</a>")
            rownames(kwh)[total] <- paste0("**", n, " - Total**")
            kwh |>
                arrange(Total) |>
                apply(
                    c(1, 2),
                    function(x) {
                        ifelse(x == 0, "<font color='red'>0</font>", paste0("<font color='green'>", x, "</font>"))
                    }
                ) |>
                as.data.frame()
        } else {
            return(NULL)
        }
    }
)
tbl <- tbl[sapply(tbl, class) != "NULL"]
tbl <- do.call(what = rbind, tbl)


detail <- rbind(
    "**overall**" = c(
        paste0(
            "**",
            search_term_hits |>
                select(count) |>
                unlist() |>
                as.vector(),
            "**"
        ),
        ""
    ),
    tbl
)

detail <- detail |>
    dplyr::rename(
        "Transformative Change @sec-transform" = s_1_transformative_change,
        "Nature @sec-nature" = s_1_nature_environment,
        "Assessment Corpus @sec-tca-corpus" = s_1_tca_corpus,
        "Ch1 01 @sec-ch1-01" = s_1_ch1_01,
        "Ch1 02 @sec-ch1-02" = s_1_ch1_02,
        "Ch1 03 @sec-ch1-03" = s_1_ch1_03,
        "Ch1 04 @sec-ch1-04" = s_1_ch1_04,
        "Ch1 05 @sec-ch1-05" = s_1_ch1_05,
        "Ch1 06 @sec-ch1-06" = s_1_ch1_06,
        "Ch2  @sec-ch2" = s_1_ch2,
        "Ch3 01 @sec-ch3-01" = s_1_ch3_01,
        "Ch3 02 @sec-ch3-02" = s_1_ch3_02,
        "Ch3 03 @sec-ch3-03" = s_1_ch3_03,
        "Ch3 04 @sec-ch3-04" = s_1_ch3_04,
        "Ch3 05 @sec-ch3-05" = s_1_ch3_05,
        "Ch3 06 @sec-ch3-06" = s_1_ch3_06,
        "Ch4 01 @sec-ch4-01" = s_1_ch4_01,
        "Ch4 02 @sec-ch4-02" = s_1_ch4_02,
        # "Ch5 Vision @sec-ch5_vision" = s_1_ch5_vision,
        "Ch5 Case @sec-case" = s_1_case,
        # "Ch5 Vision Case @sec-ch5_vision_case" = s_1_ch5_vision_case
    )

Key Papers in Individual Corpi

Summary

Each column is a different search term, and each row consists of the key papers of a specific chapter and the author who provided the key papers. The number is the number of key papers occurring in the Individual Corpus.

Show the code
in_summary <- grepl("Total|overall", rownames(detail))
knitr::kable(
    detail[in_summary, ]
)
s_1_oa Transformative Change Section 2.2.1 Nature Section 2.2.2 Assessment Corpus Section 2.2.3 Ch1 01 Section 2.2.4.1 Ch1 02 Section 2.2.4.2 Ch1 03 Section 2.2.4.3 Ch1 04 Section 2.2.4.4 Ch1 05 Section 2.2.4.5 Ch1 06 Section 2.2.4.6 Ch2 Section 2.2.5 Ch3 01 Section 2.2.6.1 Ch3 02 Section 2.2.6.2 Ch3 03 Section 2.2.6.3 Ch3 04 Section 2.2.6.4 Ch3 05 Section 2.2.6.5 Ch3 06 Section 2.2.6.6 Ch4 01 Section 2.2.7.1 Ch4 02 Section 2.2.7.2 Ch5 Case Section 2.2.11.2 Total
overall 253,514,060 18,844,396 26,116,505 4,720,072 634,602 3,263,235 16,379,848 2,555,891 26,437,484 6,595,757 111,185,757 16,563,322 34,107,427 29,311,181 10,906,330 13,399,042 21,289,270 900,528 21 56,210,784
Ch_1 - Total 42 40 41 39 19 28 35 30 31 30 41 30 33 33 22 33 35 28 0 34 623
Ch_2 - Total 22 20 22 20 9 17 18 12 17 18 22 20 19 19 15 21 21 16 0 18 345
Ch_3_Cl_3 - Total 4 4 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4 3 0 4 71
Ch_3_Cl_4 - Total 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 4 0 5 92
Ch_3_Cl_5 - Total 3 2 3 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 37
Ch_3_Cl_6 - Total 6 6 5 5 1 1 2 3 1 3 5 2 4 5 1 1 5 2 0 3 60
Ch_3 - Total 4 4 4 4 2 1 2 2 3 3 4 3 4 3 1 2 3 2 0 4 54
Ch_4_Cl_1 - Total 7 4 7 4 1 4 5 5 3 5 7 4 4 4 4 6 7 4 0 4 88
Ch_4_Cl_2 - Total 4 3 3 3 2 2 3 1 2 2 3 2 3 3 1 3 3 2 0 2 46
Ch_4_Cl_3 - Total 5 5 5 5 2 2 4 2 3 3 4 3 4 4 3 3 4 2 0 4 66
Ch_4_Cl_4 - Total 4 2 4 2 1 1 3 1 1 2 4 2 1 2 2 2 4 1 0 4 42
Ch_4_Cl_5 - Total 5 3 4 3 1 2 4 2 4 2 5 5 4 4 3 3 5 3 0 4 65
Ch_5 - Total 35 33 33 31 20 23 27 27 26 25 35 29 30 33 26 28 30 20 0 30 540
all - Total 134 120 128 116 60 82 105 87 93 95 130 102 106 110 82 104 118 81 0 108 1960

Detail

Show the code
knitr::kable(
    detail
)
s_1_oa Transformative Change Section 2.2.1 Nature Section 2.2.2 Assessment Corpus Section 2.2.3 Ch1 01 Section 2.2.4.1 Ch1 02 Section 2.2.4.2 Ch1 03 Section 2.2.4.3 Ch1 04 Section 2.2.4.4 Ch1 05 Section 2.2.4.5 Ch1 06 Section 2.2.4.6 Ch2 Section 2.2.5 Ch3 01 Section 2.2.6.1 Ch3 02 Section 2.2.6.2 Ch3 03 Section 2.2.6.3 Ch3 04 Section 2.2.6.4 Ch3 05 Section 2.2.6.5 Ch3 06 Section 2.2.6.6 Ch4 01 Section 2.2.7.1 Ch4 02 Section 2.2.7.2 Ch5 Case Section 2.2.11.2 Total
overall 253,514,060 18,844,396 26,116,505 4,720,072 634,602 3,263,235 16,379,848 2,555,891 26,437,484 6,595,757 111,185,757 16,563,322 34,107,427 29,311,181 10,906,330 13,399,042 21,289,270 900,528 21 56,210,784
Ch_1 - Click here 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 3
Ch_1 - Click here 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3
Ch_1 - Click here 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4
Ch_1 - Click here 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 5
Ch_1 - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 6
Ch_1 - Click here 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 7
Ch_1 - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 7
Ch_1 - Click here 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 8
Ch_1 - Click here 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 8
Ch_1 - Click here 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 9
Ch_1 - Click here 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 10
Ch_1 - Click here 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 11
Ch_1 - Click here 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 11
Ch_1 - Click here 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 14
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 15
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 15
Ch_1 - Click here 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 15
Ch_1 - Click here 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1 15
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 15
Ch_1 - Click here 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 16
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 16
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 16
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 16
Ch_1 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 16
Ch_1 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_1 - Total 42 40 41 39 19 28 35 30 31 30 41 30 33 33 22 33 35 28 0 34 623
Ch_2 - Click here 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 4
Ch_2 - Click here 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 1 8
Ch_2 - Click here 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 9
Ch_2 - Click here 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 10
Ch_2 - Click here 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 12
Ch_2 - Click here 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 14
Ch_2 - Click here 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 15
Ch_2 - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 15
Ch_2 - Click here 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 15
Ch_2 - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 15
Ch_2 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 15
Ch_2 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_2 - Total 22 20 22 20 9 17 18 12 17 18 22 20 19 19 15 21 21 16 0 18 345
Ch_3_Cl_3 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
Ch_3_Cl_3 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_3_Cl_3 - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_3_Cl_3 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_3 - Total 4 4 4 4 3 3 4 3 4 4 4 4 4 4 4 4 4 3 0 4 71
Ch_3_Cl_4 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
Ch_3_Cl_4 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_4 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_4 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_4 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_4 - Total 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 4 0 5 92
Ch_3_Cl_5 - Click here 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
Ch_3_Cl_5 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_3_Cl_5 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_3_Cl_5 - Total 3 2 3 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 37
Ch_3_Cl_6 - Click here 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 5
Ch_3_Cl_6 - Click here 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 6
Ch_3_Cl_6 - Click here 1 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 7
Ch_3_Cl_6 - Click here 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 8
Ch_3_Cl_6 - Click here 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 11
Ch_3_Cl_6 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_3_Cl_6 - Total 6 6 5 5 1 1 2 3 1 3 5 2 4 5 1 1 5 2 0 3 60
Ch_3 - Click here 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 8
Ch_3 - Click here 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 9
Ch_3 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_3 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
Ch_3 - Total 4 4 4 4 2 1 2 2 3 3 4 3 4 3 1 2 3 2 0 4 54
Ch_4_Cl_1 - Click here 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 4
Ch_4_Cl_1 - Click here 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 4
Ch_4_Cl_1 - Click here 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 6
Ch_4_Cl_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_4_Cl_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_4_Cl_1 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_4_Cl_1 - Click here 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 17
Ch_4_Cl_1 - Total 7 4 7 4 1 4 5 5 3 5 7 4 4 4 4 6 7 4 0 4 88
Ch_4_Cl_2 - Click here 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ch_4_Cl_2 - Click here 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 9
Ch_4_Cl_2 - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 16
Ch_4_Cl_2 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_4_Cl_2 - Total 4 3 3 3 2 2 3 1 2 2 3 2 3 3 1 3 3 2 0 2 46
Ch_4_Cl_3 - Click here 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 5
Ch_4_Cl_3 - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 7
Ch_4_Cl_3 - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 15
Ch_4_Cl_3 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_4_Cl_3 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_4_Cl_3 - Total 5 5 5 5 2 2 4 2 3 3 4 3 4 4 3 3 4 2 0 4 66
Ch_4_Cl_4 - Click here 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 6
Ch_4_Cl_4 - Click here 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 8
Ch_4_Cl_4 - Click here 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 9
Ch_4_Cl_4 - Click here 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
Ch_4_Cl_4 - Total 4 2 4 2 1 1 3 1 1 2 4 2 1 2 2 2 4 1 0 4 42
Ch_4_Cl_5 - Click here 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 6
Ch_4_Cl_5 - Click here 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 7
Ch_4_Cl_5 - Click here 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 16
Ch_4_Cl_5 - Click here 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
Ch_4_Cl_5 - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
Ch_4_Cl_5 - Total 5 3 4 3 1 2 4 2 4 2 5 5 4 4 3 3 5 3 0 4 65
Ch_5 - Click here 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2
Ch_5 - Click here 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 3
Ch_5 - Click here 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 7
Ch_5 - Click here 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 8
Ch_5 - Click here 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 8
Ch_5 - Click here 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 1 8
Ch_5 - Click here 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 9
Ch_5 - Click here 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 11
Ch_5 - Click here 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 12
Ch_5 - Click here 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 12
Ch_5 - Click here 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 13
Ch_5 - Click here 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 14
Ch_5 - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 14
Ch_5 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
Ch_5 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
Ch_5 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 17
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
Ch_5 - Total 35 33 33 31 20 23 27 27 26 25 35 29 30 33 26 28 30 20 0 30 540
all - Click here 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
all - Click here 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
all - Click here 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2
all - Click here 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 3
all - Click here 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 3
all - Click here 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 3
all - Click here 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4
all - Click here 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 4
all - Click here 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 4
all - Click here 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 4
all - Click here 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 5
all - Click here 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 5
all - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 6
all - Click here 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 6
all - Click here 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 6
all - Click here 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 6
all - Click here 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 6
all - Click here 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 7
all - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 7
all - Click here 1 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 7
all - Click here 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 7
all - Click here 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 7
all - Click here 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 7
all - Click here 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 8
all - Click here 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 8
all - Click here 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 1 8
all - Click here 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 8
all - Click here 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 8
all - Click here 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 8
all - Click here 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 1 8
all - Click here 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 9
all - Click here 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 9
all - Click here 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 9
all - Click here 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 9
all - Click here 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 9
all - Click here 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 10
all - Click here 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 10
all - Click here 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 11
all - Click here 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 11
all - Click here 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 11
all - Click here 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 11
all - Click here 1 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 12
all - Click here 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 12
all - Click here 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 12
all - Click here 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 13
all - Click here 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 14
all - Click here 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 14
all - Click here 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 14
all - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 14
all - Click here 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 15
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 15
all - Click here 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 15
all - Click here 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1 15
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 15
all - Click here 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 15
all - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 15
all - Click here 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 15
all - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 15
all - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 15
all - Click here 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 1 16
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
all - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 16
all - Click here 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 16
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 16
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 17
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Click here 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 18
all - Total 134 120 128 116 60 82 105 87 93 95 130 102 106 110 82 104 118 81 0 108 1960

TCA Corpus properties

Publications over time

The red line is the cumulative proportion of publications, the blue line the cumulative proportion of all of the Op[enAlex corpus. Both use the secondeary (red) axis.

To download high resolution, click here

Show the code
readRDS(file.path(".", "data", "tca_corpus", "publications_over_time_tca_corpus.rds")) |>
    IPBES.R::table_dt(fn = "publications_over_time")

Countries in TCA Corpus

The countries are based on the countries of the institutes of all authors, weighted by 1/no_ authors_per_paper.

The following calculations were done:

  • **count** =ifelse(is.na(count), 0, count)`
  • **log_count** =log(count + 1)`
  • **p** =count / sum(count)`
  • **count_oa** =ifelse(is.na(count_oa), 0, count)`
  • **log_count_oa** =log(count_oa + 1)`
  • **p_oa** =count_oa / sum(count_oa)`
  • **p_diff** =(p_oa - p) * 100`
  • **p_ratio** =count / count_oa`
Show the code
readRDS(file.path(".", "data", "tca_corpus", "countries_tca_corpus.rds")) |>
    IPBES.R::table_dt(fn = "publications_per_country")

All Years

To download high resolution, click here

Sectors over time

For clarity, the log of the cumulative sum of the sectors over time are shown here.

The top graph shows only the primary sector assigned, the bottom graph all sectors (first, secondary and tertiary)

To download high resolution, click here

The graph shows the proportion of the different sectors over time

To download high resolution, click here

Show the code
readRDS(file.path(".", "data", "tca_corpus", "sectors_over_time.rds")) |>
    IPBES.R::table_dt(
        fn = "sectors_over_time",
        fixedColumns = list(leftColumns = 3)
    )

Topics in corpus

Show the code
#|

cs <- cumsum(prim_topics_tca_corpus$count)
cs |>
    plot(
        type = "l",
        xlab = "Topic",
        ylab = "Cumulative Count",
        main = "Cumulative Topics in TCA Corpus"
    )

abline(
    h = 0.95 * cs[length(cs)],
    v = min(which(cs > 0.95 * cs[length(cs)])),
    col = "red"
)

text(
    x = 0.5 * length(cs),
    y = 0.95 * cs[length(cs)],
    pos = 3,
    labels = "95% of the corpus",
    col = "red"
)

Show the code
#|

prim_topics_tca_corpus |>
    relocate(count, .after = "id") |>
    IPBES.R::table_dt(
        fn = "topics_tca_corpus",
    )
Warning in instance$preRenderHook(instance): It seems your data is too big for
client-side DataTables. You may consider server-side processing:
https://rstudio.github.io/DT/server.html

SubFields in Corpus

Show the code
#|
cs <- prim_topics_tca_corpus |>
    mutate(
        id = NULL,
        topic_name = NULL,
        keywords = NULL,
        summary = NULL,
        wikipedia_url = NULL
    ) |>
    group_by(
        subfield_id,
    ) |>
    summarise(
        count = sum(count)
    ) |>
    arrange(desc(count)) |>
    dplyr::select(count) |>
    unlist() |>
    cumsum()
cs |>
    plot(
        type = "l",
        xlab = "Subfield",
        ylab = "Cumulative Count",
        main = "Cumulative Subfields in TCA Corpus"
    )

abline(
    h = 0.95 * cs[length(cs)],
    v = min(which(cs > 0.95 * cs[length(cs)])),
    col = "red"
)

text(
    x = 0.5 * length(cs),
    y = 0.95 * cs[length(cs)],
    pos = 3,
    labels = "95% of the corpus",
    col = "red"
)

Show the code
#|

prim_topics_tca_corpus |>
    mutate(
        topic_id = NULL,
        topic_name = NULL,
        keywords = NULL,
        summary = NULL,
        wikipedia_url = NULL
    ) |>
    group_by(
        subfield_id,
        subfield_name,
        field_id,
        field_name,
        domain_id,
        domain_name
    ) |>
    summarise(
        count = sum(count),
        .groups = "drop"
    ) |>
    arrange(desc(count)) |>
    relocate(count, .after = "subfield_id") |>
    DT::datatable(
        extensions = c(
            "Buttons",
            "FixedColumns",
            "Scroller"
        ),
        options = list(
            dom = "Bfrtip",
            buttons = list(
                list(
                    extend = "csv",
                    filename = fn
                ),
                list(
                    extend = "excel",
                    filename = fn
                ),
                list(
                    extend = "pdf",
                    filename = fn,
                    orientation = "landscape",
                    customize = DT::JS(
                        "function(doc) {",
                        "  doc.defaultStyle.fontSize = 5;", # Change the font size
                        "}"
                    )
                ),
                "print"
            ),
            scroller = TRUE,
            scrollY = JS("window.innerHeight * 0.7 + 'px'"),
            scrollX = TRUE,
            fixedColumns = list(leftColumns = 4)
        ),
        escape = FALSE
    )

Additional Searches subsets

Show the code
file.path(".", "data", "tca_corpus", "additional_search.rds") |>
    readRDS() |>
    knitr::kable()
x
“Forest conservation” OR
“High sea conservation” OR
“Marine protected area” OR
MPA OR
“Marine reserve” OR
“Marine park” OR
“Protected area” OR
“Remedial action” OR
“Forest Reserve” OR
“private reserve” OR
“nature reserve” OR
“ecosystem reserve” OR
“Transboundary protected area” OR
“High seas conservation” OR
“Marine resource areas” OR
“marine waters” OR
“marine managed area” OR
“national park” OR
“Agri-Environmental and Climate Measure” OR
“Environmental Law” OR
“Habitat Conservation Plan” OR
“Invasive Species Regulation” OR
“National biodiversity strategy and action plan” OR
NBSAP OR
“Wild species protection” OR
“Waste Management Regulation” OR
“Coastal management” OR
“Coastal waters management” OR
“Integrated coastal zone management” OR
“watershed management” OR
“catchment management” OR
“Integrated landscape management” OR
“Invasive alien species management” OR
“Marine and coastal governance” OR
“Marine governance” OR
“Coastal governance” OR
“Ocean governance” OR
“Sustainable wildlife management” OR
“Sustainable use” OR
“Transboundary water management” OR
“environmental impact assessment” OR
“forest monitoring” OR
“environmental monitoring” OR
“environmental remote sensing” OR
“marine monitoring” OR
“fish monitoring” OR
“species monitoring” OR
“marine mammal monitoring” OR
“coastal monitoring” OR
“ocean monitoring” OR
“ecosystem monitoring” OR
“land monitoring” OR
“Seasonal restriction” OR
“Environmental Impact Assessment”
“Access and benefit sharing” OR
“community rights” OR
“Free, prior and informed consent” OR
FPIC OR
“Human right” OR
“Indigenous and local language” OR
“Intellectual property right” OR
“International Covenant on Civil and Political Right” OR
“International Covenant on Economic, Social and Cultural Right” OR
“International Human Right Treaty” OR
“International Labour Organization Convention” OR
“Right of nature” OR
“right to water” OR
UNDRIP OR
“Universal Declaration of Human Right” OR
“United Nations Declaration on the Right of Indigenous Peoples” OR
“Legal empowerment” OR
“individual transferable rights” OR
“nature rights” OR
“land tenure” OR
“tenure right” OR
“Food sovereignty”
“Convivial conservation” OR
“Legal pluralism” OR
“Biocultural conservation” OR
“Co-management” OR
“Community-based management” OR
“Community-led conservation” OR
“Community protocol” OR
“Ecosystem-based approach” OR
“sacred site” OR
“sacred grove” OR
“Indigenous-led conservation” OR
“Indigenous co-governance” OR
“Land sovereignty” OR
“Tribal park” OR
“Biosphere reserve” OR
“recreation area” OR
“Indigenous and Community Conserved Area” OR
ICCA OR
“Other Effective area-based Conservation Measure” OR
OECM OR
“Other effective Conservation Measure” OR
“Bottom-up environmental initiative” OR
“Citizen-led environmental initiative” OR
“Community Garden” OR
“Urban gardening” OR
“Community-Led Conservation Initiative” OR
“Community-based Renewable Energy Project” OR
“Local Food Cooperative” OR
“Farmers’ Market” OR
“Local action group” OR
“Transition Town Movement” OR
“Zero Waste Community” OR
“sustainable consumption network” OR
“community quota”
“Development Control Regulation” OR
“GIS and Spatial Analysis Tool” OR
“Infrastructure Planning” OR
“Land Use Permit” OR
“Land use planning” OR
“Marine spatial planning” OR
“ocean planning” OR
“Maritime spatial planning” OR
“Master Plan” OR
“Multi-functional landscape” OR
“Participatory Planning Approach” OR
“Spatial planning” OR
“Strategic Environmental Assessment” OR
“Environmental Impact assessment” OR
“Buffer zone” OR
“land law” OR
“coastal planning area”or
“Ecosystem restoration” OR
“Ecological restoration” OR
“Connectivity restoration” OR
“Biodiversity restoration” OR
“Forest restoration” OR
“Habitat restoration” OR
Rewilding OR
“Landscape restoration” OR
“Regenerative agriculture” OR
“Regenerative farming”
“Cap resource consumption” OR
“conversion off-budget subsidies” OR
“Corporate social responsibility” OR
“Licensing and Permitting” OR
“Limit on pollution” OR
“Pollution Control Measure” OR
“public procurement” OR
“Regulation of Resource Extraction” OR
“Regulatory measure” OR
“Sustainable public procurement” OR
“Wildlife trade regulation” OR
“regulate consumption” OR
“production standards” OR
“cross-compliance” OR
“by-catch regulation” OR
“process regulation” OR
“emission caps” OR
“trade regulation” OR
“land policy” OR
“land regulation” OR
“Large-scale land acquisition regulation” OR
“Land Use Regulation” OR
“Limit on habitat destruction” OR
“Limit on resource extraction” OR
“Logging regulation” OR
“Natural resource use restriction” OR
“Zoning Regulation” OR
“territorial use-rights for fisheries” OR
“consumption fee” OR
“Tax on consumption”
“Biodiversity bond” OR
“Biodiversity compensation policy” OR
“Biodiversity offset” OR
“Cap and Trade System” OR
“cap and share” OR
“carbon credit” OR
“Commodity chain regulation” OR
“Commodity future” OR
“Compensation for environmental damage” OR
“Corporate Social Responsibility” OR
“cross-compliance incentive” OR
“Derivative trading” OR
“Ecological fiscal transfer” OR
“Environmental-positive subsidy” OR
“Environmental Tax” OR
“Eco-entrepreneurship Support” OR
“income transfer” OR
“Mitigation for environmental damage” OR
“Market-based financing mechanism” OR
“Reducing Emission from Deforestation and Forest Degradation” OR
“Reform environmental-harmful subsidy” OR
“Restoration for environmental damage” OR
“Socially responsible investment” OR
“Subsidy Reform” OR
“Tradable permit” OR
“Trade ban” OR
“True cost pricing” OR
“zero deforestation” OR
“no deforestation” OR
“environmental measures” OR
“Agricultural environmental schemes” OR
“green architecture” OR
“Carbon Border Adjustment Mechanism” OR
CBAM OR
“payment for ecosystem services” OR
REDD OR
“carbon credits” OR
“trade agreements” OR
“water quality trading” OR
“environmental impact bonds”
“supply chain tracking” OR
Certification OR
“Collaborative supply chain initiative” OR
“Consumer demand for transparency” OR
“Corporate disclosure mandate” OR
“Eco Labeling” OR
“Fair Trade Certification” OR
“Forest Stewardship Council Certification” OR
“green branding” OR
Guideline OR
“ISO Standard” OR
Labeling OR
“Mandatory reporting requirement” OR
“Public procurement policy” OR
Standard OR
“Supplier code of conduct requirement” OR
“Third-party auditing” OR
“Third-party verification” OR
“Whistleblower protection law” OR
“LEED Certification” OR
“Marine Stewardship Council Certification” OR
“Non-GMO Project Verification” OR
“Organic Certification” OR
“Participatory Guarantee System” OR
“Rainforest Alliance Certification” OR
“UTZ Certification” OR
“friends of the sea” OR
“seafood watch” OR
“Global sustainable seafood initiative” OR
“International Sustainability Standards”
“Collaborative Consumption” OR
“Dietary transition” OR
“Food waste reduction” OR
“frugal consumption” OR
“green consumption” OR
“Localized food system” OR
“low-impact diet” OR
“Normative feedback” OR
“plant-based diet” OR
“Responsible consumption” OR
“reduce consumption” OR
reuse OR
recycle OR
“shared consumption” OR
“shared ownership” OR
“Sustainable consumption” OR
“Sustainable sourcing practice” OR
Agroecology OR
Agroforestry OR
“Best practice in production” OR
“Biological agriculture” OR
“Carbon farming” OR
“Climate-smart agriculture” OR
Compost OR
“Conservation tillage” OR
“Crop diversification” OR
“Crop rotation” OR
“Holistic planned grazing” OR
“Organic agriculture” OR
“Reduced impact logging” OR
“Responsible production” OR
“Sustainable agricultural intensification” OR
“Sustainable fishing practice” OR
“Sustainable design” OR
“Sustainable fishing” OR
“Sustainable production” OR
“Swidden agriculture” OR
“sustainable land management” OR
“sustainable aquaculture” OR
“Sustainable Small-Scale Fisheries” OR
“Guidelines on the Responsible Governance of Tenure of Land, Fisheries, and Forests” OR
“Land and water stewardship” OR
“responsible fisheries” OR
“Collaborative Consumption” OR
“Community-supported Agriculture”
“Biodiversity finance” OR
“Conservation finance” OR
“Conservation funding” OR
“Conservation philanthropy” OR
“Conservation trust fund” OR
“Debt-for-nature swap” OR
“Direct funding to community” OR
“Ecological finance” OR
“Environmental finance” OR
“Nature finance” OR
“Public funding for conservation” OR
“Public-private partnership” OR
“climate finance” OR
“ocean finance” OR
“environmental harmful subsidies” OR
“nature-dependent economic activities”
“environmental mobilizations” OR
“environmental defenders” OR
“environmental action groups” OR
“environmental social movements” OR
“name and shame” OR
commoning OR
“Non-violent protest and persuasion” OR
“Formal petitions” OR
“public campaigns” OR
“street protests” OR
“collective action networks” OR
“media-based activism” OR
“Non-cooperation” OR
Strikes OR
boycotts OR
“refusal of compensation payments” OR
“environmental lawsuits” OR
“objections to environmental impacts assessments” OR
“road blockades” OR
“land occupation” OR
“hunger strikes” OR
“Environmental defender protection”
“Access to urban service” OR
Biofilter OR
Bioswale OR
“Blue-green corridor” OR
“Constructed wetland” OR
“Energy efficient building” OR
“Floodplain restoration” OR
“Green infrastructure” OR
“green logistics” OR
“Green roof” OR
“Green street” OR
“Green wall” OR
“Living shoreline” OR
“Multi-purpose structure” OR
“Permeable pavement” OR
“Public transport” OR
“Rain garden” OR
“Riparian buffer” OR
“Sustainable drainage system” OR
“Sustainable infrastructure” OR
“Urban agriculture space” OR
“Urban forest” OR
“Urban park” OR
“Vegetated swale” OR
“Water infrastructure” OR
“nature-based solution”
Biofuel OR
“Biomass energy production” OR
“Biomimetic” OR
“Climate-smart agriculture” OR
“Coordinated transport” OR
“Coordinated heating” OR
“energy sharing platform” OR
“Fuel-efficient vehicle” OR
“Geothermal energy” OR
“Green building material” OR
“Hybrid vehicle” OR
“local currency” OR
Minigrid OR
microgrid OR
“Replacement fertilizer” OR
“Small renewable energy technology” OR
“Smart meter” OR
“Solar panel” OR
“Solar photovoltaic system” OR
“Wind turbine” OR
“green technology”
“Doughnut planning” OR
“Gross National Happiness” OR
“Human Development Index” OR
“Genuine Progress Indicator” OR
“Index of Sustainable Economic Welfare” OR
“Happy Planet Index” OR
“Inclusive Wealth Index” OR
“Social Progress Index” OR
“wellbeing budget” OR
“Ecological Footprint” OR
“inequality index”
“WTO reform” OR
“World Trade Organization reform” OR
“World Trade Organisation reform” OR
“Central bank reform” OR
“IMF reform” OR
“International Monetary Fund reform” OR
“financial reform” OR
“sustainable finance” OR
“nature finance” OR
“biodiversity finance” OR
“wealth tax” OR
“regulate inequality” OR
“regulate inequalities” OR
“tax the one percent” OR
“progressive taxation on wealth” OR
“tobin tax” OR
“reduce tax havens” OR
“dismantle off-shore accounts” OR
“reduce debt” OR
“eliminate debt”
“Alternative economic model” OR
Bioeconomy OR
“Circular economy” OR
“circular bioeconomy” OR
Commoning OR
Degrowth OR
“downscale production” OR
“Ecosystem accounting” OR
“Mainstreaming biodiversity” OR
“Natural capital accounting” OR
“Sharing economy” OR
“Caring economy” OR
“Steady state economy” OR
“System of Environmental Economic Accounting” OR
“nature positive economy” OR
“Economics of Biodiversity” OR
“Wellbeing Economics” OR
“Doughnut Economics” OR
“Life-Centered Economics” OR
“real wealth of nations” OR
“Business for Nature” OR
“regenerative business” OR
“regenerative capitalism” OR
“ecological economics” OR
“Natural Social Contract” OR
“Alternative business model” OR
“B-Corp” OR
“B-Corporation” OR
“Benefit Corporation” OR
“Cradle-to-Cradle” OR
“Employee-owned Business” OR
“Fair Trade” OR
“Open Source” OR
“Platform Cooperative” OR
“Subscription-based Model” OR
“not-for-profit economy” OR
“Accounting for nature” OR
“nature-related financial disclosure” OR
TNFD OR
“Corporate Sustainability Reporting Directive” OR
“nature-positive business” OR
“relocalize economy”
“institutional arrangement” OR
“social capital” OR
“environmental advocacy” OR
“biodiversity advocacy” OR
“Institutional entrepreneurship” OR
“Institutional reform”
“Access to information law”or “Citizen Science Initiative” OR
“Community-based natural resource management” OR
“Community Meeting” OR
“Community-Based Participatory Research” OR
“Deliberative Democracy Process” OR
“Global action network” OR
“Indigenous and local community participation” OR
“Legal and Policy Framework for Participation” OR
“Multi-stakeholder platform” OR
“Online Platform” OR
“Participation in international process” OR
“Participatory restoration” OR
“Participatory evaluation and learning” OR
“Participatory Mapping and GIS” OR
“Public Consultation and Hearing” OR
“Public participation in environmental impact assessment” OR
“Stakeholder engagement” OR
“Bottom-up governance approach” OR
“Gender-responsive governance” OR
“Gender inclusive governance” OR
“Public participation law”or “Public Participation and Access to Information Law” OR
“Resource Management Law” OR
“Environmental public interest litigation”
“Agenda 21” OR
“Aichi Biodiversity Target” OR
“Bilateral agreement” OR
“Basel Convention” OR
“Cartagena Protocol” OR
“Convention on Biological Diversity” OR
“Convention on Migratory Species” OR
“CMS” OR
“Convention on International Trade in Endangered Species of Wild Fauna and Flora” OR
“BBNJ Agreement” OR
“High Seas Treaty” OR
“Agreement under the United Nations Convention on the Law of the Sea on the Conservation and Sustainable Use of Marine Biological Diversity of Areas beyond National Jurisdiction” OR
“International Convention for the Prevention of Pollution from Ships” OR
“MARPOL” OR
“EU Green Deal” OR
“Freshwater treaty” OR
“Genetic resource agreement” OR
“Global deal for nature” OR
“Global trade system” OR
“International agreement” OR
“International Treaty on Plant Genetic Resources for Food and Agriculture” OR
“Kyoto Protocol” OR
“Minamata Convention” OR
“Montreal Protocol” OR
“Multilateral environmental agreement” OR
“Nagoya Protocol” OR
“Paris Agreement” OR
“Rio Declaration” OR
“Ramsar Convention” OR
“Rotterdam Convention” OR
“Shipping agreement” OR
“Sustainable Development Goal” OR
“SDGs” OR
“Stockholm Convention” OR
“United Nations Convention to Combat Desertification” OR
“United Nations Framework Convention on Climate Change” OR
“United Nations Convention on the Law of the sea” OR
“United Nations Agreement of Straddling Fish Stocks and Highly Migratory Fish Stocks”
“Adaptive management framework” OR
“Citizen assembly” OR
“Conflict resolution mechanism” OR
“Deliberative democracy mechanism” OR
“Deep democracy” OR
“Local governance structure” OR
“Open government initiative” OR
“Participatory decision-making process” OR
“Policy co-creation” OR
“Policy co-design” OR
“Policy monitoring” OR
“Transparency and accountability mechanism” OR
“Advocacy network” OR
“adaptive governance” OR
“informed governance” OR
“accountable governance” OR
“accountability” OR
“planning, monitoring, evaluation and review” OR
“monitoring, evaluation and learning” OR
“reflexive governance” OR
“Community-based monitoring”
“Address corruption” OR
“Convention against Corruption” OR
“Whistleblower protection law” OR
“measures against corruption” OR
“fight lobbies” OR
“Anti-discrimination law” OR
“Decentralization law” OR
“Equitable access to justice” OR
“Freedom of information law” OR
“Judicial independence” OR
“Ombudsman institution”
“Community cooperation” OR
“Customary institution” OR
“Customary law” OR
“Customary norm” OR
“Customary tenure” OR
“IPLC governance” OR
“Indigenous jurisdiction” OR
“Intergenerational knowledge transmission” OR
“Resource stewardship”
“Behavioral change” OR
“Behavioral nudge” OR
“Consumption reduction” OR
“Dietary transition” OR
“Food waste reduction” OR
“Normative feedback” OR
“Nudging” OR
“Belief system” OR
“Biophilia” OR
“Environmental Connection” OR
“Ecological Connection” OR
“Nature Connection” OR
“Identity shift” OR
“Inner transformation” OR
“Personal meaning” OR
“Personal transformation”
“Community bond” OR
“Community solidarity” OR
“Civic engagement initiative” OR
“Community dialogue” OR
“Cultural transformation” OR
“Mass media campaign” OR
“Regenerative culture” OR
“Social media platform” OR
“Youth empowerment program” OR
“Peer-to-peer communication” OR
“environmental discourse” OR
“environmental narrative” OR
“environmental storyline” OR
“environmental perspective” OR
“green discourse” OR
“green narrative” OR
“green storyline” OR
“green perspective” OR
“Unitive narrative” OR
“Cultural narrative” OR
“Storytelling initiative” OR
“Campaign on consumer goods” OR
“Choice architecture”
“Environmental education” OR
“Transformational learning” OR
“Transformative learning” OR
“environmental curriculum” OR
“K-12” OR
“Adult learning” OR
“Social learning” OR
“Solution space” OR
“Transformation lab” OR
“Imagination infrastructure” OR
“Experiential teaching” OR
“Experiential learning” OR
“Indigenous education” OR
“Unitive education” OR
“Transformative learning spaces” OR
“Awareness campaign” OR
“Capacity building” OR
“Capacity development” OR
“Cultural exchange program” OR
“Cultural revitalization” OR
“Practical learning” OR
“Inner capacity” OR
“Inner development goal” OR
“Sacred teaching”
“Art-science collaboration” OR
“Co-creation of knowledge” OR
“co-production of knowledge” OR
“knowledge coproduction” OR
“Co-creative inquiry” OR
“Collaborative knowledge production” OR
“Collaborative research and learning” OR
“Collective knowledge generation” OR
“Breeding knowledge” OR
“Joint knowledge development” OR
“Jointly constructed knowledge” OR
“Knowledge co-creation” OR
“Knowledge co-design” OR
“Participatory knowledge creation” OR
“Multiple evidence-based approach” OR
“Participatory research and development” OR
“Weaving knowledge” OR
“Interfaith collaboration” OR
“Interfaith dialogue” OR
“Co-Design”
“Connection to nature” OR
“Continuity with ancestors” OR
“Cultural preservation” OR
“Cultural revitalization” OR
“Environmental stewardship” OR
“Ethical framework” OR
“Human-nature connection” OR
“Spiritual connection” OR
“Human-nature relation” OR
“nature connectedness” OR
“environment connectedness”or “Community health” OR
“Cultural pluralism” OR
“Eco-centrism” OR
“Ecohealth” OR
“Harmony with nature” OR
“Holistic worldview” OR
“Interconnectedness of all life forms” OR
“Living in balance” OR
“One health” OR
“Planetary health” OR
“planetary wellbeing” OR
“intrinsic value of biodiversity” OR
“biocultural diversity” OR
“Unitive vision” OR
“Water-energy-food nexus” OR
“Holistic management” OR
“Indigenous worldview” OR
“Balanced relationship” OR
“Caring for nature” OR
“relationality” OR
“relational values” OR
“Respect for Diversity” OR
“Stewardship” OR
“intrinsic value” OR
“utilitarian value” OR
“plural value”
“Boundary organization” OR
“Change agent” OR
“Collaborative initiative” OR
“Community network” OR
“Connector” OR
“Facilitator” OR
“Innovation broker” OR
“Indigenous peoples’ network” OR
“Intermediary” OR
“Multiplier” OR
“Boundary spanner” OR
“Knowledge network” OR
“Learning network” OR
“Middle actor” OR
“Multi-stakeholder platform” OR
“New collaborative setting” OR
“Partnership network” OR
“Policy network” OR
“Respectful partnership” OR
“Technology network” OR
“Transition intermediary”

Differences between the used media search term and the original media search term:

Show the code
diffviewer::visual_diff(
    "input/tca_corpus/search terms/media.org.txt",
    "input/tca_corpus/search terms/media.txt"
)

==== APPENDIX ====

Strategies/Options/Instruments for transformative change

The file strategies_options.md contains the terms for the different strategies and options.

I will now iterate through all of them and identify the number of hits per individual search term. This can be used as a result in itself in interpreting the importance of each term as well as to shorten the search term to be able to use it together with the TCA search term.

Methods

Prepare Search Terms

Show the code
fn <- file.path("data", "tca_corpus", "strategies_options_terms.rds")
if (!file.exists(fn)) {
    sts <- data.frame(
        "Strategy" = NA,
        "Option" = NA,
        term = params$sts_strategies_options
    )
    sts <- sts[sts$term != "", ]
    for (i in 1:nrow(sts)) {
        if (grepl("^# ", sts$term[i])) {
            strategy <- gsub("^# ", "", sts$term[i])
        } else if (grepl("^## ", sts$term[i])) {
            option <- gsub("^## ", "", sts$term[i])
        } else {
            sts$Strategy[i] <- strategy
            sts$Option[i] <- option
        }
    }
    sts <- sts[!is.na(sts$Strategy), ]
    sts <- sts[!is.na(sts$Option), ]

    sts$Name <- paste0(sts$Strategy, " ||| ", sts$Option)

    strategies_options_terms <- split(sts$term, sts$Name)

    saveRDS(strategies_options_terms, file = fn)
}

Run the search terms

Show the code
#|

fn <- file.path("data", "tca_corpus", "strategies_options.rds")
if (!file.exists(file.path(fn))) {
    strategies_options_terms <- readRDS(file.path("data", "tca_corpus", "strategies_options_terms.rds"))
    strategies_options <- lapply(
        names(strategies_options_terms),
        function(strategy) {
            message("- ", strategy)
            result <- list()
            result$term <- paste(strategies_options_terms[[strategy]], collapse = " ")
            result$count <- NA
            result$years <- data.frame(publication_year = NA, count = NA)
            result$assess_search_terms <- assess_search_term(
                st = strategies_options_terms[[strategy]],
                AND_term = params$s_1_tca_corpus,
                remove = " OR$",
                excl_others = FALSE,
                verbose = FALSE,
                mc.cores = 1
            ) |>
                dplyr::arrange(desc(count))
            #
            try(
                {
                    result$count <- openalexR::oa_fetch(
                        title_and_abstract.search = IPBES.R::compact(paste0("(", params$s_1_tca_corpus, ") AND (", result$term, ")")),
                        count_only = TRUE,
                        output = "list",
                        verbose = FALSE
                    )$count
                    message("  - ", result$count, " hits")
                    #
                    result$years <- openalexR::oa_fetch(
                        title_and_abstract.search = IPBES.R::compact(paste0("(", params$s_1_tca_corpus, ") AND (", result$term, ")")),
                        group_by = "publication_year",
                        output = "dataframe",
                        verbose = FALSE
                    ) |>
                        dplyr::select(
                            publication_year = key_display_name,
                            count
                        ) |>
                        dplyr::arrange(
                            publication_year
                        )
                },
                silent = FALSE
            )
            return(result)
        }
    )

    # Assign the names to the first and second level list
    names(strategies_options) <- names(strategies_options_terms)

    saveRDS(strategies_options, file = fn)
}

Results

Count of Strategies / Options Table

Show the code
#|

strategies_options <- readRDS(file.path("data", "tca_corpus", "strategies_options.rds"))

data <- lapply(
    names(strategies_options),
    function(strategy) {
        data.frame(
            Strategy = strsplit(strategy, " \\|\\|\\| ")[[1]][1],
            Concept = strsplit(strategy, " \\|\\|\\| ")[[1]][2],
            Count = strategies_options[[strategy]]$count,
            Count_until_1992 = sum(strategies_options[[strategy]]$years$count[strategies_options[[strategy]]$years$publication_year <= 1992]),
            Count_after_1992 = sum(strategies_options[[strategy]]$years$count[strategies_options[[strategy]]$years$publication_year > 1992])
        )
    }
) |>
    do.call(what = rbind)

data |>
    IPBES.R::table_dt(
        fn = "strategies_options_counts",
        fixedColumns = list(leftColumns = 2)
    )

Plot of the Count of the Strategies / Options split at 1992

This data is corrected for different research oputput before and after 1992 by dividing by the overall reasarch output in that perio as reflected on OpenAlex.

Show the code
#|
strategies_options <- readRDS(file.path("data", "tca_corpus", "strategies_options.rds"))

oa <- openalexR::oa_fetch(
    search = "",
    group_by = "publication_year",
    output = "dataframe",
    verbose = FALSE
)
Show the code
oa_until_1992 <- sum(oa$count[oa$key < 1992])
oa_after_1992 <- sum(oa$count[oa$key > 1992])

data <- lapply(
    names(strategies_options),
    function(strategy) {
        data.frame(
            Strategy = strsplit(strategy, " \\|\\|\\| ")[[1]][1],
            Concept = strsplit(strategy, " \\|\\|\\| ")[[1]][2],
            Count = strategies_options[[strategy]]$count,
            Count_until_1992 = sum(strategies_options[[strategy]]$years$count[strategies_options[[strategy]]$years$publication_year <= 1992]),
            Count_after_1992 = sum(strategies_options[[strategy]]$years$count[strategies_options[[strategy]]$years$publication_year > 1992])
        )
    }
) |>
    do.call(what = rbind) |>
    dplyr::mutate(
        Strategy = paste0(Strategy, " |||| ", Concept),
        Count_until_1992 = Count_until_1992 / oa_until_1992,
        Count_after_1992 = Count_after_1992 / oa_after_1992,
    ) |>
    dplyr::group_by(Strategy) |>
    dplyr::mutate(
        Count_until_1992_p = Count_until_1992 / sum(Count_until_1992 + Count_after_1992),
        Count_after_1992_p = Count_after_1992 / sum(Count_until_1992 + Count_after_1992)
    )


figure <- data |>
    tidyr::pivot_longer(
        cols = c(Count_until_1992, Count_after_1992),
        names_to = "Period",
        values_to = "Count_year"
    ) |>
    # Create the plot
    ggplot(aes(x = Strategy, y = Count_year, fill = Period)) +
    geom_bar(stat = "identity") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +
    labs(x = "Strategy", y = "Count", fill = "Period")


ggplot2::ggsave(
    file.path("figures", "tca_corpus", "strategies_options_time_split.pdf"),
    width = 12,
    height = 18,
    figure
)
ggplot2::ggsave(
    file.path("figures", "tca_corpus", "strategies_options_time_split.png"),
    width = 12,
    height = 18,
    figure
)

figure <- data |>
    tidyr::pivot_longer(
        cols = c(Count_until_1992_p, Count_after_1992_p),
        names_to = "Period",
        values_to = "Count_p_year"
    ) |>
    # Create the plot
    ggplot(aes(x = Strategy, y = Count_p_year, fill = Period)) +
    geom_bar(stat = "identity") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +
    labs(x = "Strategy", y = "Count", fill = "Period")


ggplot2::ggsave(
    file.path("figures", "tca_corpus", "strategies_options_time_split_p.pdf"),
    width = 12,
    height = 18,
    figure
)
ggplot2::ggsave(
    file.path("figures", "tca_corpus", "strategies_options_time_split_p.png"),
    width = 12,
    height = 18,
    figure
)

The graph shows the by overall research output corrected publications before and after 1992 for each Strategy ||| Option

To download high resolution, click here

The second graph shows the proportion of the by overall research output corrected publications before and after 1992 for each Strategy ||| Option

To download high resolution, click here

Assesment of individual terms

These numbers are the number of hits of TCA Corpus AND each individual term of the Option

Show the code
strategies_options <- readRDS(file.path("data", "tca_corpus", "strategies_options.rds"))

lapply(
    names(strategies_options),
    function(strategy) {
        res <- data.frame(
            Strategy = strsplit(strategy, " \\|\\|\\| ")[[1]][1],
            Concept = strsplit(strategy, " \\|\\|\\| ")[[1]][2],
            Term = strategies_options[[strategy]]$assess_search_terms$term,
            Count = strategies_options[[strategy]]$assess_search_terms$count
        )
    }
) |>
    do.call(what = rbind) |>
    IPBES.R::table_dt(
        fn = "strategies_options_assessment_terms",
        fixedColumns = list(leftColumns = 2)
    )

Differences between Original and shortened search terms

Due to length constraints, search terms were removed by removing the ones with the mallest number of hits.

The differences the original search term and the used search term is shown below

Show the code
#|

diffviewer::visual_diff(
    file.path("input", "tca_corpus", "search terms", "strategies_options.org.md"),
    file.path("input", "tca_corpus", "search terms", "strategies_options.md")
)

Counts over Years for each TCA Corpus AND Strategies / Options

Show the code
#|

strategies_options <- readRDS(file.path("data", "tca_corpus", "strategies_options.rds"))

lapply(
    names(strategies_options),
    function(strategy) {
        data.frame(
            Strategy = strsplit(strategy, " \\|\\|\\| ")[[1]][1],
            Concept = strsplit(strategy, " \\|\\|\\| ")[[1]][2],
            Year = strategies_options[[strategy]]$years$publication_year,
            Count = strategies_options[[strategy]]$years$count
        )
    }
) |>
    do.call(what = rbind) |>
    IPBES.R::table_dt(
        fn = "strategies_options_counts_per_year",
        fixedColumns = list(leftColumns = 2)
    )

Actors for transformative change

The file actors.md contains the terms for the different actors.

I will now iterate through all of them and identify the number of hits per individual search term. This can be used as a result in itself in interpreting the importance of each term as well as to shorten the search term to be able to use it together with the TCA search term.

Methods

Prepare Search Terms

Show the code
fn <- file.path("data", "tca_corpus", "actors_terms.rds")
if (!file.exists(fn)) {
    sts <- data.frame(
        Actor = NA,
        term = params$sts_actors
    )
    sts <- sts[sts$term != "", ]

    for (i in 1:nrow(sts)) {
        if (grepl("^# ", sts$term[i])) {
            actor <- gsub("^# ", "", sts$term[i])
        } else {
            sts$Actor[i] <- actor
        }
    }
    sts <- sts[!is.na(sts$Actor), ]

    sts$Name <- paste0(sts$Actor)

    actors_terms <- split(sts$term, sts$Name)

    saveRDS(actors_terms, file = fn)
}

Run the search terms

Show the code
fn <- file.path("data", "tca_corpus", "actors.rds")
if (!file.exists(file.path(fn))) {
    actors_terms <- readRDS(file.path("data", "tca_corpus", "actors_terms.rds"))
    actors_options <- lapply(
        names(actors_terms),
        function(actor) {
            message("- ", actor)
            result <- list()
            result$term <- paste(actors_terms[[actor]], collapse = " ")
            result$count <- NA
            result$years <- data.frame(publication_year = NA, count = NA)
            result$assess_search_terms <- assess_search_term(
                st = actors_terms[[actor]],
                AND_term = params$s_1_tca_corpus,
                remove = " OR$",
                excl_others = FALSE,
                verbose = FALSE,
                mc.cores = params$mc.cores
            ) |>
                dplyr::arrange(desc(count))
            #
            try(
                {
                    result$count <- openalexR::oa_fetch(
                        title_and_abstract.search = IPBES.R::compact(paste0("(", params$s_1_tca_corpus, ") AND (", result$term, ")")),
                        count_only = TRUE,
                        output = "list",
                        verbose = TRUE
                    )$count
                    message("  - ", result$count, " hits")
                    #
                    result$years <- openalexR::oa_fetch(
                        title_and_abstract.search = IPBES.R::compact(paste0("(", params$s_1_tca_corpus, ") AND (", result$term, ")")),
                        group_by = "publication_year",
                        output = "dataframe",
                        verbose = FALSE
                    ) |>
                        dplyr::select(
                            publication_year = key_display_name,
                            count
                        ) |>
                        dplyr::arrange(
                            publication_year
                        )
                },
                silent = FALSE
            )
            return(result)
        }
    )

    # Assign the names to the first and second level list
    names(actors_options) <- names(actors_terms)

    saveRDS(actors_options, file = fn)
}

Results

Count of Actors Table

Show the code
#|

actors <- readRDS(file.path("data", "tca_corpus", "actors.rds"))

data <- lapply(
    names(actors),
    function(actor) {
        data.frame(
            Actor = actor,
            Count = actors[[actor]]$count,
            Count_until_1992 = sum(actors[[actor]]$years$count[actors[[actor]]$years$publication_year <= 1992]),
            Count_after_1992 = sum(actors[[actor]]$years$count[actors[[actor]]$years$publication_year > 1992])
        )
    }
) |>
    do.call(what = rbind)

data |>
    IPBES.R::table_dt(
        fn = "strategies_options_counts",
        fixedColumns = list(leftColumns = 2)
    )

Assesment of individual terms

These numbers are the number of hits of TCA Corpus AND each individual term of the Option

Show the code
actors <- readRDS(file.path("data", "tca_corpus", "actors.rds"))

lapply(
    names(actors),
    function(actor) {
        res <- data.frame(
            Actor = actor,
            Term = actors[[actor]]$assess_search_terms$term,
            Count = actors[[actor]]$assess_search_terms$count
        )
    }
) |>
    do.call(what = rbind) |>
    IPBES.R::table_dt(
        fn = "actors_assessment_terms",
        fixedColumns = list(leftColumns = 2)
    )

Differences between Original and shortened search terms

Due to length constraints, search terms were removed by removing the ones with the mallest number of hits.

The differences the original search term and the used search term is shown below

Show the code
#|

diffviewer::visual_diff(
    file.path("input", "tca_corpus", "search terms", "actors.org.md"),
    file.path("input", "tca_corpus", "search terms", "actors.md")
)

Counts over Years for each TCA Corpus AND Actors

Show the code
#|

actors <- readRDS(file.path("data", "tca_corpus", "actors.rds"))

lapply(
    names(actors),
    function(actor) {
        data.frame(
            Actor = actor,
            Year = actors[[actor]]$years$publication_year,
            Count = actors[[actor]]$years$count
        )
    }
) |>
    do.call(what = rbind) |>
    IPBES.R::table_dt(
        fn = "actors_counts_per_year",
        fixedColumns = list(leftColumns = 2)
    )

Plot of the Count of the Actors split at 1992

This data is corrected for different research oputput before and after 1992 by dividing by the overall reasarch output in that perio as reflected on OpenAlex.

Show the code
#|

actors <- readRDS(file.path("data", "tca_corpus", "actors.rds"))

oa <- openalexR::oa_fetch(
    search = "",
    group_by = "publication_year",
    output = "dataframe",
    verbose = FALSE
)
Show the code
oa_until_1992 <- sum(oa$count[oa$key < 1992])
oa_after_1992 <- sum(oa$count[oa$key > 1992])

data <- lapply(
    names(actors),
    function(actor) {
        data.frame(
            Actor = actor,
            Count = actors[[actor]]$count,
            Count_until_1992 = sum(actors[[actor]]$years$count[actors[[actor]]$years$publication_year <= 1992]),
            Count_after_1992 = sum(actors[[actor]]$years$count[actors[[actor]]$years$publication_year > 1992])
        )
    }
) |>
    do.call(what = rbind) |>
    dplyr::mutate(
        Count_until_1992 = Count_until_1992 / oa_until_1992,
        Count_after_1992 = Count_after_1992 / oa_after_1992,
    ) |>
    dplyr::group_by(
        Actor
    ) |>
    dplyr::mutate(
        Count_until_1992_p = Count_until_1992 / sum(Count_until_1992 + Count_after_1992),
        Count_after_1992_p = Count_after_1992 / sum(Count_until_1992 + Count_after_1992)
    )


figure <- data |>
    tidyr::pivot_longer(
        cols = c(Count_until_1992, Count_after_1992),
        names_to = "Period",
        values_to = "Count_year"
    ) |>
    # Create the plot
    ggplot(aes(x = Actor, y = Count_year, fill = Period)) +
    geom_bar(stat = "identity") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +
    labs(x = "Actors", y = "Count", fill = "Period")


ggplot2::ggsave(
    file.path("figures", "tca_corpus", "actors_time_split.pdf"),
    width = 12,
    height = 18,
    figure
)
ggplot2::ggsave(
    file.path("figures", "tca_corpus", "actors_time_split.png"),
    width = 12,
    height = 18,
    figure
)

figure <- data |>
    tidyr::pivot_longer(
        cols = c(Count_until_1992_p, Count_after_1992_p),
        names_to = "Period",
        values_to = "Count_p_year"
    ) |>
    # Create the plot
    ggplot(aes(x = Actor, y = Count_p_year, fill = Period)) +
    geom_bar(stat = "identity") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) +
    labs(x = "Actor", y = "Count", fill = "Period")


ggplot2::ggsave(
    file.path("figures", "tca_corpus", "actors_time_split_p.pdf"),
    width = 12,
    height = 18,
    figure
)
ggplot2::ggsave(
    file.path("figures", "tca_corpus", "actors_time_split_p.png"),
    width = 12,
    height = 18,
    figure
)

The graph shows the by overall research output corrected publications before and after 1992 for each Actor

To download high resolution, click here

The second graph shows the proportion of the by overall research output corrected publications before and after 1992 for each Actor

To download high resolution, click here

Reuse

Citation

BibTeX citation:
@report{krug2024,
  author = {Krug, Rainer M.},
  title = {Data {Management} {Report} {Transformative} {Change}
    {Assessment} {Corpus} - {SOD}},
  date = {2024-05-03},
  doi = {10.5281/zenodo.10251349},
  langid = {en},
  abstract = {The literature search for the assessment corpus was
    conducted using search terms provided by the experts and refined in
    co-operation with the Knowldge and Data task force. The search was
    conducted using {[}OpenAlex{]}(https://openalex.org), scripted from
    {[}R{]}(https://cran.r-project.org) to use the
    {[}API{]}(https://docs.openalex.org). Search terms for the following
    searches were defined: **Transformative Change**, **Nature /
    Environment** and **additional search terms for individual chapters
    and sub-chapters** To assess the quality of the corpus, sets of
    key-papers were selected by the experts to verify if these are in
    the corpus. These key-papers were selected per chapter / sub-chapter
    to ensure that the corpus is representative of each chapter.}
}
For attribution, please cite this work as:
Krug, Rainer M. 2024. “Data Management Report Transformative Change Assessment Corpus - SOD.” Report Transformative Change Assessment Corpus. https://doi.org/10.5281/zenodo.10251349.